Javassist annoations问题

Wic*_*koo 4 java annotations javassist

我正在尝试使用javassist生成我的Entity类.一切顺利,直到我将GeneratedValue注释添加到Id字段.@Id注释工作正常,但是当我添加@GeneeratedValue时,我得到一个异常.这是我的代码:

  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();
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外:

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)
Run Code Online (Sandbox Code Playgroud)

这似乎与@GeneratedValue有关.当我单独使用它而没有id我也得到这个例外.当我使用eclipse调试器来观察变量值时,我得到了这个

com.sun.jdi.InvocationException occurred invoking method.
Run Code Online (Sandbox Code Playgroud)

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

我是javassist的新手.谁能帮我?

Bec*_*ari 5

我想你不是在寻找发生的事情(我今天遇到了同样的问题),但如果你这样做......

当使用构造函数Annotation(ConstPool cp,CtClass clazz)时,javassist预先为该Annotation类创建所有成员(请参阅Annotation.java,第98行).

在这种情况下,它很容易,因为有一个明确的评论:"// todo现在不支持枚举." (第101行)正如您在javax.persistence.GeneratedValue中看到的那样,有一个名为GenerationType类型的成员,它是一个Enum.

虽然如果Annotation类具有类型类的任何成员,它将无法工作,从而在后代类的MemberValue.write方法上导致NullPointerException.

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

PS:我正在使用javassist 3.12.1.GA