【问题标题】:@Override doesn't work when using ByteBuddy disableClassFormatChanges使用 ByteBuddy disableClassFormatChanges 时 @Override 不起作用
【发布时间】:2019-01-12 20:36:38
【问题描述】:

我正在编写一个 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,但没有给出成功的结果。

这里可能有什么问题?

【问题讨论】:

    标签: java bytecode byte-buddy javaagents


    【解决方案1】:

    回答

    我认为您的配置存在问题。

    你能试试下一个吗(类似于你的,但没有.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");
      }
    

    可能对于跟踪调用方法的实例很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多