我正在编写一个java代理,当我使用Buddy使用以下选项时,我遇到了一个非常有趣的问题:
net.bytebuddy.agent.builder.AgentBuilder#disableClassFormatChanges问题是,不管我是否在超类的子类中重写超类的方法,超类中的方法总是被调用的。
代理:
public class Main {
public static void premain(String agentOps, Instrumentation inst) {
instrument(agentOps, inst);
}
public static void agentmain(String agentOps, Instrumentation inst) {
instrument(agentOps, inst);
}
private static void instrument(String agentOps, Instrumentation inst) {
new AgentBuilder.Default().with(new Eager())
.disableClassFormatChanges()
.type((any()))
.transform((builder, typeDescription, classLoader, module) ->
builder.method(any()).intercept(Advice.to(LoggingAdvice.class)))
.installOn(inst);
}
public static class LoggingAdvice {
@Advice.OnMethodEnter
static void enter(@Advice.Origin String method) {
}
@Advice.OnMethodExit
static void exit(@Advice.Origin String method) {
}
}
}以及用于测试的类:
超级:
public class Test1 {
public void test() {
System.out.println("Test 1");
}
}儿童:
public class Test2 extends Test1 {
@Override
public void test() {
System.out.println("Test 2");
}
}主修班:
public class Main {
public static void main(String[] args) {
new Test1().test();
new Test2().test();
}
}结果是:
Test 1
Test 1预期结果:
Test 1
Test 2如果没有特工,一切都会如愿以偿。
我试着和ElementMatcher玩,但没有取得成功。
这里可能有什么问题?
发布于 2019-04-23 12:37:35
回答
我认为在你的配置中有问题。
您是否可以尝试下一个(类似于您的,但没有.disableClassFormatChanges()):
private static void instrument(String agentOps, Instrumentation inst) {
new AgentBuilder.Default()
.with(new Eager())
.type((any()))
.transform((builder, typeDescription, classLoader, module) ->
builder
.method(any())
.intercept(Advice.to(LoggingAdvice.class)))
.installOn(inst);
}附注:
要使循环更清晰,可以使用跟踪电话,例如
@Advice.OnMethodEnter
static void enter(@Advice.Origin String method) {
System.out.println("enter");
}
@Advice.OnMethodExit
static void exit(@Advice.Origin String method) {
System.out.println("exit");
}可能对跟踪调用方法的实例很有用。
https://stackoverflow.com/questions/54163653
复制相似问题