是否可以生成具有使用指定注释注释的字段的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);
问题在于我不知道在新创建的类型上应用现有注释的方法......有没有办法做到这一点?
答案 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();