ByteBuddy MethodDelegation 在 Java Agent 中不起作用
ByteBuddy MethodDelegation not working in Java Agent
我有一个 premain(),其中所有用特定注释注释的方法都应该委托给特定的 class。一般来说,我看起来像这样:
public static void premain( final String agentArguments, final Instrumentation instrumentation ) {
CountingInterception ci = new CountingInterception();
new AgentBuilder.Default()
.type(ElementMatchers.isAnnotatedWith(com.codahale.metrics.annotation.Counted.class))
.transform((builder, type, classLoader, module) ->
builder.method(ElementMatchers.any())
.intercept(MethodDelegation.to(ci))
).installOn(instrumentation);
}
使用调试器显示这部分已处理,但如果调用带注释的方法,则没有任何反应。
CountingInterception 看起来像这样
public class CountingInterception {
@RuntimeType
public Object intercept(@DefaultCall final Callable<?> zuper, @Origin final Method method, @AllArguments final Object... args) throws Exception {
String name = method.getAnnotation(Counted.class).name();
if (name != null) {
// do something
}
return zuper.call();
}
}
感谢任何提示!
使用 ByteBuddy 1.6.9
我假设您正在尝试执行与 Java 8 默认方法调用不同的操作。您是要使用调用超级方法的 @SuperCall
吗?
我建议您:
1.减少你的拦截器什么都不做。创建一个将 MethodDelegation
与 SuperMethodCall
链接起来的拦截器。
2. 注册一个AgentBuilder.Listener
将错误写入控制台。
我确定 Byte Buddy 无法绑定您的方法,因为您的拦截器只能应用于提供默认方法实现的 类。
为了实现我想做的事情,进行了以下更改:
准备中:
CountingInterception ci = new CountingInterception();
new AgentBuilder.Default()
.type(declaresMethod(isAnnotatedWith(Counted.class)))
.transform((builder, type, classLoader, module) -> builder
.method(isAnnotatedWith(Counted.class))
.intercept(MethodDelegation.to(ci).andThen(SuperMethodCall.INSTANCE))
).installOn(instrumentation);
并且在 CountingInterception 中:
public void interceptor(@Origin final Method method) throws Exception {
String name = method.getAnnotation(Counted.class).name();
if (name != null) {
// do something
}
}
我有一个 premain(),其中所有用特定注释注释的方法都应该委托给特定的 class。一般来说,我看起来像这样:
public static void premain( final String agentArguments, final Instrumentation instrumentation ) {
CountingInterception ci = new CountingInterception();
new AgentBuilder.Default()
.type(ElementMatchers.isAnnotatedWith(com.codahale.metrics.annotation.Counted.class))
.transform((builder, type, classLoader, module) ->
builder.method(ElementMatchers.any())
.intercept(MethodDelegation.to(ci))
).installOn(instrumentation);
}
使用调试器显示这部分已处理,但如果调用带注释的方法,则没有任何反应。
CountingInterception 看起来像这样
public class CountingInterception {
@RuntimeType
public Object intercept(@DefaultCall final Callable<?> zuper, @Origin final Method method, @AllArguments final Object... args) throws Exception {
String name = method.getAnnotation(Counted.class).name();
if (name != null) {
// do something
}
return zuper.call();
}
}
感谢任何提示!
使用 ByteBuddy 1.6.9
我假设您正在尝试执行与 Java 8 默认方法调用不同的操作。您是要使用调用超级方法的 @SuperCall
吗?
我建议您:
1.减少你的拦截器什么都不做。创建一个将 MethodDelegation
与 SuperMethodCall
链接起来的拦截器。
2. 注册一个AgentBuilder.Listener
将错误写入控制台。
我确定 Byte Buddy 无法绑定您的方法,因为您的拦截器只能应用于提供默认方法实现的 类。
为了实现我想做的事情,进行了以下更改:
准备中:
CountingInterception ci = new CountingInterception();
new AgentBuilder.Default()
.type(declaresMethod(isAnnotatedWith(Counted.class)))
.transform((builder, type, classLoader, module) -> builder
.method(isAnnotatedWith(Counted.class))
.intercept(MethodDelegation.to(ci).andThen(SuperMethodCall.INSTANCE))
).installOn(instrumentation);
并且在 CountingInterception 中:
public void interceptor(@Origin final Method method) throws Exception {
String name = method.getAnnotation(Counted.class).name();
if (name != null) {
// do something
}
}