我可以重新定义该类以将Foo
的方法替换为Bar
的方法:
ByteBuddy byteBuddy = new ByteBuddy();
byteBuddy
.redefine(Bar.class)
.name(Foo.class.getName())
.make()
.load(Foo.class.getClassLoader(),
ClassReloadingStrategy.fromInstalledAgent());
Foo foo = new Foo()
foo.m()
// output is bar
我如何使用AgentBuilder
做同样的工作,替换所有Foo
的方法,而不是委托
new AgentBuilder.Default()
.with(AgentBuilder.Listener.StreamWriting.toSystemOut())
.with(RedefinitionStrategy.RETRANSFORMATION)
.type(ElementMatchers.is(Foo.class))
.transform(
( builder, typeDescription, classLoader, module ) ->
builder.method(ElementMatchers.any()).intercept( //how to write ?)
).installOnByteBuddyAgent();
谢谢!
答案 0 :(得分:0)
您可以将各个片段放在一起:
new AgentBuilder.Default()
.with(AgentBuilder.Listener.StreamWriting.toSystemOut())
.with(RedefinitionStrategy.RETRANSFORMATION)
.type(ElementMatchers.is(Foo.class))
.transform((builder, typeDescription, classLoader, module) ->
new ByteBuddy().redefine(Bar.class).name(Foo.class.getName()))
.installOnByteBuddyAgent();
这仅在替换的类型与形状兼容时有效。