我正在使用ByteBuddy将另一个字段引用替换为类的方法。在另一个问题中,建议我使用 net.bytebuddy.asm.MemberSubstitution 类。我一直在寻找有关如何在mi java agent中使用此方法的示例,但是找不到。
我想使用以下代码:
MemberSubstitution.relaxed()
.field(ElementMatchers.named("oneField"))
.onRead()
.replaceWith(otherField);
我的经纪人是:
public class MyAgent {
public static void premain(String arg, Instrumentation inst)
throws Exception {
File temp = Files.createTempDirectory("tmp").toFile();
ClassInjector.UsingInstrumentation.of(temp,
ClassInjector.UsingInstrumentation.Target.BOOTSTRAP, inst)
.inject(Collections.singletonMap(
new TypeDescription.ForLoadedType(MyInterceptor.class),
ClassFileLocator.ForClassLoader.read(MyInterceptor.class).resolve()));
new AgentBuilder.Default()
.enableBootstrapInjection(inst, temp)
.type(isAnnotatedWith(CriptoObject.class))
.transform(new AgentBuilder.Transformer() {
@Override
public DynamicType.Builder<?> transform(
DynamicType.Builder<?> builder,
TypeDescription typeDescription,
ClassLoader classLoader,
JavaModule module) {
return builder.method(any())
.intercept(MethodDelegation.to(MyInterceptor.class)
.andThen(SuperMethodCall.INSTANCE));
}
}).installOn(inst);
}
}
拦截器代码为
public class MyInterceptor {
public static void intercept(@Origin Method m, @This Object o)
throws Exception {
System.out.println("Intercepted!" + o.getClass().getField("b").get(o));
}
}
我不知道将 MemberSubstitution 代码放在何处以转换特定方法。
请,有人可以帮我吗?
预先感谢
答案 0 :(得分:0)
它的访问者可以转换现有代码,而无需在您通过以下方式注册的地方添加任何内容:
builder = builder.method(any()).visit(MemberSubstitution.relaxed()
.field(ElementMatchers.named("oneField"))
.onRead()
.replaceWith(otherField));