java - 如何将字段添加到 ByteBuddy 中的类并在方法拦截器中设置/获取该值

标签 java bytecode byte-buddy

我正在使用 byte-buddy 在 Ignite 之上构建一个 ORM,我们需要向类添加一个字段,然后在方法拦截器中访问它。

下面是一个向类中添加字段的示例

final ByteBuddy buddy = new ByteBuddy();

final Class<? extends TestDataEnh> clz =  buddy.subclass(TestDataEnh.class)
        .defineField("stringVal",String.class)
        .method(named("setFieldVal")).intercept(
            MethodDelegation.to(new SetterInterceptor())
    )
    .make()
    .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
    .getLoaded();

final TestDataEnh enh = clz.newInstance();

enh.getFieldVal();
enh.setFieldVal();

System.out.println(enh.getClass().getName());

拦截器是这样的

public class SetterInterceptor {
    @RuntimeType
    public  Object intercept() {
        System.out.println("Invoked method with: ");
        return null;
    }
}

那么如何将新字段的值放入拦截器中,以便我可以更改它的值? (字符串值)

提前致谢

最佳答案

您可以使用 FieldProxy通过名称访问字段。您需要先安装 FieldProxy.Binder 并将其注册到 MethodDdelegation 上,然后才能使用它,因为它需要自定义类型以进行类型安全检测。 javadoc 解释了如何做到这一点。或者,您可以通过使用 @This 在实例上使用反射。 JVM 在优化反射的使用方面非常有效。

一个例子是:

interface FieldGetter {
  Object getValue();
}

interface FieldSetter {
  void setValue(Object value);
}

public class SetterInterceptor {
  @RuntimeType
  public  Object intercept(@FieldProxy("stringVal") FieldGetter accessor) {
    Object value = accessor.getValue();
    System.out.println("Invoked method with: " + value);
    return value;
  }
}

对于 bean 属性,FieldProxy 注释不需要显式名称,而是从拦截的 getter 或 setter 的名称中发现名称。

安装可以按如下方式完成:

MethodDelegation.to(SetterInterceptor.class)
                .appendParameterBinder(FieldProxy.Binder.install(FieldGetter.class, 
                                                                 FieldSetter.class));

关于java - 如何将字段添加到 ByteBuddy 中的类并在方法拦截器中设置/获取该值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35087647/

相关文章:

java - 如何从 16 位数据中获取 4 位?

java - JaCoCo 分支覆盖尝试资源

java - 用方法调用替换来自字段的 java 方法调用

java - 如何从 Java 代理停止/暂停主程序/线程

java - 在使用 ByteBuddy 创建的构造函数中创建自定义代码

Java Hibernate 选择计数与其他列

java - 将多个 JFrame 中的值检索到单个 JFrame

java - 将鼠标移到 Chrome 网页元素上时计时器会加快

java - Cucumber 中的 Rerun.txt 指的是类路径而不是 Feature 文件夹

java - 在 Byte Buddy 中禁用标识符验证