我正在尝试使用javassist生成我的实体类。在我将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();这是我得到的异常:
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调试器监视变量值时,我得到以下结果
com.sun.jdi.InvocationException occurred invoking method.而不是注释值。但是对于Id注释,它显示了一个javassist注释对象。
我是新接触javassist的。有谁可以帮我?
发布于 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
https://stackoverflow.com/questions/3028304
复制相似问题