首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javassist注解问题

Javassist注解问题
EN

Stack Overflow用户
提问于 2010-06-12 18:22:18
回答 1查看 3.8K关注 0票数 4

我正在尝试使用javassist生成我的实体类。在我将GeneratedValue注释添加到Id字段之前,一切都很顺利。@Id注释可以很好地工作,但是当我添加@GeneeratedValue时,我得到一个异常。这是我的代码:

代码语言:javascript
复制
  ClassPool cp = ClassPool.getDefault();
  CtClass ctClass = cp.makeClass("test.Snake");
  ClassFile classFile = ctClass.getClassFile();
  classFile.setVersionToJava5();

  AnnotationsAttribute attribute = new AnnotationsAttribute(classFile.getConstPool(), AnnotationsAttribute.visibleTag);

  Annotation idAnnotation = new Annotation(classFile.getConstPool(), ClassPool.getDefault().get("javax.persistence.Id"));
  attribute.addAnnotation(idAnnotation);

  Annotation gvAnnotation = new Annotation(classFile.getConstPool(), ClassPool.getDefault().get("javax.persistence.GeneratedValue"));
  attribute.addAnnotation(gvAnnotation);

  CtField idField = new CtField(ClassPool.getDefault().get("java.lang.Long"), "id", ctClass);
  idField.getFieldInfo().addAttribute(attribute);
  ctClass.addField(idField);

  CtField nameField = new CtField(ClassPool.getDefault().get("java.lang.String"), "name", ctClass);
  ctClass.addField(nameField);

  AnnotationsAttribute attr = new AnnotationsAttribute(classFile.getConstPool(), AnnotationsAttribute.visibleTag);
  Annotation annotation = new Annotation(classFile.getConstPool(), ClassPool.getDefault().get("javax.persistence.Entity"));
  attr.addAnnotation(annotation);
  classFile.addAttribute(attr);

  snakeClass = ctClass.toClass();
  newInstance = snakeClass.newInstance();

这是我得到的异常:

代码语言:javascript
复制
java.lang.NullPointerException
 at javassist.bytecode.ConstPool.getUtf8Info(ConstPool.java:565)
 at javassist.bytecode.annotation.EnumMemberValue.getValue(EnumMemberValue.java:98)
 at javassist.bytecode.annotation.EnumMemberValue.write(EnumMemberValue.java:116)
 at javassist.bytecode.annotation.Annotation.write(Annotation.java:316)
 at javassist.bytecode.AnnotationsAttribute.setAnnotations(AnnotationsAttribute.java:246)
 at javassist.bytecode.AnnotationsAttribute.addAnnotation(AnnotationsAttribute.java:211)
 at ClassLoadingTest.javassitTest(ClassLoadingTest.java:56)

这似乎是@GeneratedValue的一个问题。当我单独使用它而不使用id时,我也会得到这个异常。当我使用eclipse调试器监视变量值时,我得到以下结果

代码语言:javascript
复制
com.sun.jdi.InvocationException occurred invoking method.

而不是注释值。但是对于Id注释,它显示了一个javassist注释对象。

我是新接触javassist的。有谁可以帮我?

EN

回答 1

Stack Overflow用户

发布于 2011-05-03 05:47:01

我猜你不会再寻找发生了什么(我今天也有同样的问题),但如果你这样做了…

当使用构造函数注释(ConstPool cp,CtClass clazz)时,javassist会预先创建该注释类的所有成员(参见Annotation.java,第98行)。

在这种情况下,这很容易,因为有一个明确的注释:"// todo枚举目前不受支持。“(第101行)正如您在javax.persistence.GeneratedValue中看到的,有一个名为GenerationType类型的成员,它是一个枚举。

但是,如果Annotation类有任何class类型的成员,它将无法工作,从而导致子类的MemberValue.write方法上出现NullPointerException。

解决方案或变通方法就是您所做的,使用另一个构造函数手动添加成员,或者(我不认为这是一个好的选择)在Annotation中为每个类成员设置一个实例。

PS:我使用的是javassist3.12.1.GA

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3028304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档