CGLib - 创建一个带有一些字段的bean并在其上放置注释?

时间:2014-01-10 23:05:38

标签: java annotations cglib

是否可以生成具有使用指定注释注释的字段的bean类?我知道可以创建一个bean但是注释呢?我找不到任何关于它的信息,所以我对它有很强的疑虑,唯一能确定的方法就是在这里问...

//我发现了一些可能有用的内容......请验证此代码。它使用javassist功能。

    // pool creation
    ClassPool pool = ClassPool.getDefault();
    // extracting the class
    CtClass cc = pool.getCtClass(clazz.getName());
    // looking for the method to apply the annotation on
    CtField fieldDescriptor = cc.getDeclaredField(fieldName);
    // create the annotation
    ClassFile ccFile = cc.getClassFile();
    ConstPool constpool = ccFile.getConstPool();
    AnnotationsAttribute attr = new AnnotationsAttribute(constpool,
            AnnotationsAttribute.visibleTag);

    Annotation annot = new Annotation("sample.PersonneName", constpool);
    annot.addMemberValue("name",
            new StringMemberValue("World!! (dynamic annotation)", ccFile.getConstPool()));
    attr.addAnnotation(annot);

    // add the annotation to the method descriptor
    fieldDescriptor.getFieldInfo().addAttribute(attr);

问题在于我不知道在新创建的类型上应用现有注释的方法......有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

简短的回答是否定的。 Cglib本身不支持此类功能。 Cglib很老,它的核心是在将注释引入Java之前编写的。 Eversince,cglib没有保持太多。

但是,您可以将ASM(构建于其上的工具cglib)ClassVisitor走私到Enhancer并手动添加注释。但是我建议你直接使用ASM构建bean。对于一个简单的POJO bean而言,这不是一项艰巨的任务,ASM是一个伟大的,维护良好的,记录良好的工具。 Cglib不是。

更新:您可能希望查看能够满足您要求的我的库Byte Buddy。以下代码将创建Object的子类,其公共字段foo的类型为String,且public可见性。该字段由

注释
@Retention(RetentionType.RUNTIME)
@interface MyAnnotation { }

class MyAnnotationImpl implements MyAnnotation {
  @Override
  public Class<? extends Annotation> annotationType() {
    return MyAnnotation.class;
  }
}

new ByteBuddy()
  .subclass(Object.class)
  .defineField("foo", String.class, MemberVisibility.PUBLIC)
  .annotateField(new MyAnnotationImpl())
  .make()
  .load(getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
  .getLoaded()
  .newInstance();