Java 字节码生成

Java 字节码生成,java,bytecode,byte-buddy,Java,Bytecode,Byte Buddy,我有一个bean类 BeanClass { <prop1>; <prop2>; <prop3>; //getters and setters ... } 我想生成一个如下所示的验证器- BeanValidator { ValidationResult validate(BeanClass bean) { ValidationResult validationResult = new ValidationResult();

我有一个bean类

BeanClass {

  <prop1>;
  <prop2>;
  <prop3>;

  //getters and setters
  ...
}
我想生成一个如下所示的验证器-

BeanValidator {

  ValidationResult validate(BeanClass bean) {
    ValidationResult validationResult = new ValidationResult();

    //prop1, prop3 are mandatory...
    notNull(bean.getProp1(), validationResult);
    notNull(bean.getProp3(), validationResult);

    //prop2 must not be more than 255 characters in length
    doesNotExceedMaxLength(bean.getProp2(), 255, validationResult)

    return validationResult;
  }
}
在运行时查看bean类时,将决定哪些字段是必需的,哪些字段的值不能超过某个数字


如何使用Byte Buddy执行此操作?

我认为您不想为此使用Byte Buddy。这就是反射API的用途。使用Byte Buddy不会给您带来任何性能优势,并且由于Byte Buddy不会创建任何源代码,您也不会进一步记录您的应用程序


为什么要使用代码生成来实现这样的验证器?

我们必须验证数百万项。反思getter并在bean实例上调用它们(即使方法实例被缓存)并不能解决这个问题。我使用reflect asm并获得了显著的性能改进。我想为什么不进一步生成验证器本身呢。
BeanValidator {

  ValidationResult validate(BeanClass bean) {
    ValidationResult validationResult = new ValidationResult();

    //prop1, prop3 are mandatory...
    notNull(bean.getProp1(), validationResult);
    notNull(bean.getProp3(), validationResult);

    //prop2 must not be more than 255 characters in length
    doesNotExceedMaxLength(bean.getProp2(), 255, validationResult)

    return validationResult;
  }
}