Java @覆盖不';使用ByteBuddy disableClassFormatChanges时不起作用

Java @覆盖不';使用ByteBuddy disableClassFormatChanges时不起作用,java,bytecode,byte-buddy,javaagents,Java,Bytecode,Byte Buddy,Javaagents,我正在编写一个java代理,当我使用Byte Buddy和以下选项时,我遇到了一个非常有趣的问题: net.bytebuddy.agent.builder.AgentBuilder#disableClassFormatChanges 问题是不管我是否在超类的子类中重写超类的方法,总是调用来自超类的方法 代理人: public class Main { public static void premain(String agentOps, Instrumentation inst) {

我正在编写一个java代理,当我使用Byte 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,但没有成功

这里可能有什么问题

答复 我认为您的配置中存在问题

请尝试下一个(与您的类似,但没有
。disableClassFormatChanges()
):

附笔。 例如,为了更清楚地了解通话周期,您可以使用跟踪电话

  @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");
  }
可能对跟踪调用方法的实例很有用

  @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");
  }