gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:25:49 26 4
gpt4 key购买 nike

是否可以生成一个 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);

问题是我不知道如何在新创建的类型上应用现有注释...有办法吗?

最佳答案

简短的回答是否定的。 Cglib 本身不支持此类功能。 Cglib 相当古老,其核心是在 Java 引入注解之前编写的。从那以后,cglib 就没有过多维护了。

但是,您可以将 ASM(构建工具 cglib)ClassVisitor 走私到 Enhancer 中,然后手动添加注释。但是,我建议您直接使用 ASM 构建您的 bean。对于一个简单的 POJO bean,这不是一项艰巨的任务,ASM 是一个很棒的、维护良好的、文档齐全的工具。 Cglib 不是。

更新:你可能想看看我的图书馆Byte Buddy能够满足您的要求。以下代码将创建 Object 的子类,其公共(public)字段 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();

关于java - CGLib - 创建一个带有一些字段的 bean 并在它们上面放置注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21056121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com