首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@重写在使用ByteBuddy disableClassFormatChanges时不起作用

@重写在使用ByteBuddy disableClassFormatChanges时不起作用
EN

Stack Overflow用户
提问于 2019-01-12 20:36:38
回答 1查看 262关注 0票数 1

我正在编写一个java代理,当我使用Buddy使用以下选项时,我遇到了一个非常有趣的问题:

代码语言:javascript
复制
net.bytebuddy.agent.builder.AgentBuilder#disableClassFormatChanges

问题是,不管我是否在超类的子类中重写超类的方法,超类中的方法总是被调用的。

代理:

代码语言:javascript
复制
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) {
    }
}

}

以及用于测试的类:

超级:

代码语言:javascript
复制
public class Test1 {

public void test() {
    System.out.println("Test 1");
}

}

儿童:

代码语言:javascript
复制
public class Test2 extends Test1 {

@Override
public void test() {
    System.out.println("Test 2");
}

}

主修班:

代码语言:javascript
复制
public class Main {

public static void main(String[] args) {
    new Test1().test();
    new Test2().test();
}

}

结果是:

代码语言:javascript
复制
Test 1
Test 1

预期结果:

代码语言:javascript
复制
Test 1
Test 2

如果没有特工,一切都会如愿以偿。

我试着和ElementMatcher玩,但没有取得成功。

这里可能有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-23 12:37:35

回答

我认为在你的配置中有问题。

您是否可以尝试下一个(类似于您的,但没有.disableClassFormatChanges()):

代码语言:javascript
复制
  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);
  }

附注:

要使循环更清晰,可以使用跟踪电话,例如

代码语言:javascript
复制
  @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");
  }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54163653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档