ByteBuddy的MemberSubstitution类的使用

时间:2018-08-01 15:59:42

标签: java byte-buddy

我正在使用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 代码放在何处以转换特定方法。

请,有人可以帮我吗?

预先感谢

1 个答案:

答案 0 :(得分:0)

它的访问者可以转换现有代码,而无需在您通过以下方式注册的地方添加任何内容:

builder = builder.method(any()).visit(MemberSubstitution.relaxed()
  .field(ElementMatchers.named("oneField"))
  .onRead()
  .replaceWith(otherField));