@Override 在使用 ByteBuddy disableClassFormatChanges 时不起作用
@Override doesn't work when using ByteBuddy disableClassFormatChanges
我正在编写一个 java 代理,当我使用带有以下选项的 Byte Buddy 时,我遇到了一个非常有趣的问题:
net.bytebuddy.agent.builder.AgentBuilder#disableClassFormatChanges
问题是我是否在 superclass 的 child 中覆盖 super class 的方法并不重要,来自 super[=43= 的方法] 总是被调用。
代理人:
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) {
}
}
}
我用于测试的 classes:
超级:
public class Test1 {
public void test() {
System.out.println("Test 1");
}
}
Child:
public class Test2 extends Test1 {
@Override
public void test() {
System.out.println("Test 2");
}
}
主要class:
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()
):
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);
}
P.S.
为了使周期更清晰,您可以使用跟踪您的来电等方式
@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");
}
可能对跟踪调用方法的实例很有用。
我正在编写一个 java 代理,当我使用带有以下选项的 Byte Buddy 时,我遇到了一个非常有趣的问题:
net.bytebuddy.agent.builder.AgentBuilder#disableClassFormatChanges
问题是我是否在 superclass 的 child 中覆盖 super class 的方法并不重要,来自 super[=43= 的方法] 总是被调用。
代理人:
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) {
}
}
}
我用于测试的 classes:
超级:
public class Test1 {
public void test() {
System.out.println("Test 1");
}
}
Child:
public class Test2 extends Test1 {
@Override
public void test() {
System.out.println("Test 2");
}
}
主要class:
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()
):
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);
}
P.S.
为了使周期更清晰,您可以使用跟踪您的来电等方式
@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");
}
可能对跟踪调用方法的实例很有用。