From c775072f67cf8810c40152f5fd50546cab900469 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:17:30 +0200 Subject: [PATCH 1/6] internal-class-loader --- .../classloader/BootDelegationInstrumentation.java | 9 ++++++--- .../classloader/ClassLoaderInstrumentationModule.java | 5 +++++ .../classloader/LoadInjectedClassInstrumentation.java | 9 ++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java index e40cea1c41..74f6f2e3fe 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java @@ -21,6 +21,7 @@ import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -99,13 +100,15 @@ public class BootDelegationInstrumentation implements TypeInstrumentation { return null; } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) Class result, - @Advice.Enter Class resultFromBootstrapLoader) { + public static Class onExit( + @Advice.Return Class originalResult, @Advice.Enter Class resultFromBootstrapLoader) { + Class result = originalResult; if (resultFromBootstrapLoader != null) { result = resultFromBootstrapLoader; } + return result; } } } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java index 441fdc0b80..93341bbb19 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java @@ -48,4 +48,9 @@ public class ClassLoaderInstrumentationModule extends InstrumentationModule new ResourceInjectionInstrumentation(), new DefineClassInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java index 81aea69de8..61e6e76ab2 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java @@ -20,6 +20,7 @@ import io.opentelemetry.javaagent.bootstrap.InjectedClassHelper; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -63,16 +64,18 @@ public class LoadInjectedClassInstrumentation implements TypeInstrumentation { if (helperClass != null) { return helperClass; } - return null; } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) Class result, @Advice.Enter Class loadedClass) { + public static Class onExit( + @Advice.Return Class originalResult, @Advice.Enter Class loadedClass) { + Class result = originalResult; if (loadedClass != null) { result = loadedClass; } + return result; } } } From 72edf42fd1628875ac22a1a053d48a92cdb32b42 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:28:05 +0200 Subject: [PATCH 2/6] internal-eclipse-osgi-3.6 --- .../internal/osgi/EclipseOsgiInstrumentation.java | 9 ++++++--- .../internal/osgi/EclipseOsgiInstrumentationModule.java | 9 ++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java index e4a8bda14d..6998a6467c 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java @@ -13,6 +13,7 @@ import io.opentelemetry.javaagent.bootstrap.internal.InClassLoaderMatcher; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -52,13 +53,15 @@ class EclipseOsgiInstrumentation implements TypeInstrumentation { return InClassLoaderMatcher.get() && !packageName.startsWith("io.opentelemetry."); } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) boolean result, - @Advice.Enter boolean inClassLoaderMatcher) { + public static boolean onExit( + @Advice.Return boolean originalResult, @Advice.Enter boolean inClassLoaderMatcher) { + boolean result = originalResult; if (inClassLoaderMatcher) { result = false; } + return result; } } } diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java index 63906fc886..8def552c25 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java @@ -10,11 +10,13 @@ import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) -public class EclipseOsgiInstrumentationModule extends InstrumentationModule { +public class EclipseOsgiInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public EclipseOsgiInstrumentationModule() { super("internal-eclipse-osgi", "internal-eclipse-osgi-3.6"); } @@ -29,4 +31,9 @@ public class EclipseOsgiInstrumentationModule extends InstrumentationModule { public List typeInstrumentations() { return singletonList(new EclipseOsgiInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } From a8cd4f7ad45ea1fda5dad358e37c2c571131487e Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:40:57 +0200 Subject: [PATCH 3/6] internal-reflection --- .../java/instrumentation/TestHelperClass.java | 6 ++++++ .../TestInstrumentationModule.java | 5 +++++ .../instrumentation/TestTypeInstrumentation.java | 16 ++++++++-------- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java index fa310587f7..baab1839bb 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java @@ -5,11 +5,17 @@ package instrumentation; +import io.opentelemetry.instrumentation.api.util.VirtualField; + /** * Class that will be injected in target classloader with inline instrumentation and proxied with * indy instrumentation */ public class TestHelperClass { + // virtual field needs to be in an helper class for indy instrumentation + public static final VirtualField VIRTUAL_FIELD = + VirtualField.find(Runnable.class, String.class); + public TestHelperClass() {} } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java index 67a74f26e7..04061086ae 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java @@ -40,4 +40,9 @@ public class TestInstrumentationModule extends InstrumentationModule .proxyBuilder("instrumentation.TestHelperClass") .inject(InjectionMode.CLASS_AND_RESOURCE); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index e8c05c8c1b..64a53b7bc7 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -7,10 +7,10 @@ package instrumentation; import static net.bytebuddy.matcher.ElementMatchers.named; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -32,21 +32,21 @@ public class TestTypeInstrumentation implements TypeInstrumentation { @SuppressWarnings("unused") public static class TestAdvice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { - VirtualField.find(Runnable.class, String.class).set(test, "instrumented"); - result = "instrumented"; + public static String methodExit(@Advice.This Runnable test) { + TestHelperClass.VIRTUAL_FIELD.set(test, "instrumented"); + return "instrumented"; } } @SuppressWarnings("unused") public static class Test2Advice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { - result = VirtualField.find(Runnable.class, String.class).get(test); + public static String methodExit(@Advice.This Runnable test) { + return TestHelperClass.VIRTUAL_FIELD.get(test); } } } From 6ac9fb4eb54d2d104b9a37b17493f0cf495fdb72 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:42:16 +0200 Subject: [PATCH 4/6] internal-url-class-loader --- .../java/instrumentation/TestInstrumentationModule.java | 9 ++++++++- .../java/instrumentation/TestTypeInstrumentation.java | 6 ++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java index d9e406633d..27e405e576 100644 --- a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java +++ b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java @@ -10,10 +10,12 @@ import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.List; @AutoService(InstrumentationModule.class) -public class TestInstrumentationModule extends InstrumentationModule { +public class TestInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public TestInstrumentationModule() { super("test-instrumentation"); } @@ -22,4 +24,9 @@ public class TestInstrumentationModule extends InstrumentationModule { public List typeInstrumentations() { return singletonList(new TestTypeInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index fe84d88b82..8ba3db630e 100644 --- a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -11,6 +11,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -34,9 +35,10 @@ public class TestTypeInstrumentation implements TypeInstrumentation { @SuppressWarnings("unused") public static class GetHostNameAdvice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit(@Advice.Return(readOnly = false) String hostName) { - hostName = "not-the-host-name"; + public static String methodExit() { + return "not-the-host-name"; } } } From fd0069ca6cec657ca2c863fb832a22d8303ebbea Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:17:30 +0200 Subject: [PATCH 5/6] revert changes for integration tests --- .../java/instrumentation/TestHelperClass.java | 6 ------ .../TestInstrumentationModule.java | 5 ----- .../instrumentation/TestTypeInstrumentation.java | 16 ++++++++-------- 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java index baab1839bb..fa310587f7 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java @@ -5,17 +5,11 @@ package instrumentation; -import io.opentelemetry.instrumentation.api.util.VirtualField; - /** * Class that will be injected in target classloader with inline instrumentation and proxied with * indy instrumentation */ public class TestHelperClass { - // virtual field needs to be in an helper class for indy instrumentation - public static final VirtualField VIRTUAL_FIELD = - VirtualField.find(Runnable.class, String.class); - public TestHelperClass() {} } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java index 04061086ae..67a74f26e7 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java @@ -40,9 +40,4 @@ public class TestInstrumentationModule extends InstrumentationModule .proxyBuilder("instrumentation.TestHelperClass") .inject(InjectionMode.CLASS_AND_RESOURCE); } - - @Override - public boolean isIndyReady() { - return true; - } } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index 64a53b7bc7..e8c05c8c1b 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -7,10 +7,10 @@ package instrumentation; import static net.bytebuddy.matcher.ElementMatchers.named; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; -import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -32,21 +32,21 @@ public class TestTypeInstrumentation implements TypeInstrumentation { @SuppressWarnings("unused") public static class TestAdvice { - @AssignReturned.ToReturned @Advice.OnMethodExit - public static String methodExit(@Advice.This Runnable test) { - TestHelperClass.VIRTUAL_FIELD.set(test, "instrumented"); - return "instrumented"; + public static void methodExit( + @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { + VirtualField.find(Runnable.class, String.class).set(test, "instrumented"); + result = "instrumented"; } } @SuppressWarnings("unused") public static class Test2Advice { - @AssignReturned.ToReturned @Advice.OnMethodExit - public static String methodExit(@Advice.This Runnable test) { - return TestHelperClass.VIRTUAL_FIELD.get(test); + public static void methodExit( + @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { + result = VirtualField.find(Runnable.class, String.class).get(test); } } } From 7b443bd4454ba728b7d83ef6251019768ec65ca7 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:40:12 +0200 Subject: [PATCH 6/6] keep changes to the advice migration --- .../instrumentation/TestTypeInstrumentation.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index e8c05c8c1b..a364632def 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -11,6 +11,7 @@ import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -32,21 +33,21 @@ public class TestTypeInstrumentation implements TypeInstrumentation { @SuppressWarnings("unused") public static class TestAdvice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { + public static String methodExit(@Advice.This Runnable test) { VirtualField.find(Runnable.class, String.class).set(test, "instrumented"); - result = "instrumented"; + return "instrumented"; } } @SuppressWarnings("unused") public static class Test2Advice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { - result = VirtualField.find(Runnable.class, String.class).get(test); + public static String methodExit(@Advice.This Runnable test) { + return VirtualField.find(Runnable.class, String.class).get(test); } } }