【发布时间】:2014-04-28 08:32:03
【问题描述】:
我正在使用 Javassist(Java 1.7) 向 ClassA 类添加注释,但出现异常。我究竟做错了什么?我试过的代码是这样的:
ClassA.java
public class ClassA
{
}
添加方法
public static <T> Class<T> addXmlRootAnnotationDynamicly(Class<T> declaredTyp) throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException
{
//pool creation
ClassPool pool = ClassPool.getDefault();
//extracting the class
CtClass cc = pool.getCtClass(declaredTyp.getCanonicalName());
// create the annotation
ClassFile ccFile = cc.getClassFile();
ConstPool constpool = ccFile.getConstPool();
AnnotationsAttribute attr = new AnnotationsAttribute(constpool, AnnotationsAttribute.visibleTag);
Annotation annot = new Annotation("javax.xml.bind.annotation.XmlRootElement", constpool);
attr.addAnnotation(annot);
// add the annotation to the class
cc.getClassFile().addAttribute(attr);
// transform the ctClass to java class
Class<T> dynamiqueBeanClass = cc.toClass();
//instanciating the updated class
// T sayHelloBean = dynamiqueBeanClass.newInstance();
return dynamiqueBeanClass;
}
打电话
Class<ClassA> addXmlRootAnnotationDynamicly = addXmlRootAnnotationDynamicly(ClassA.class);
例外
javassist.CannotCompileException:由 java.lang.LinkageError:加载程序(sun/misc/Launcher$AppClassLoader 的实例):尝试重复名称的类定义:“de/it_p/pvlight/share/util/ClassA” 在 javassist.ClassPool.toClass(ClassPool.java:1099) 在 javassist.ClassPool.toClass(ClassPool.java:1042) 在 javassist.ClassPool.toClass(ClassPool.java:1000) 在 javassist.CtClass.toClass(CtClass.java:1224) 在 de.it_p.pvlight.share.util.JAXBUtil.addXmlRootAnnotationDynamicly(JAXBUtil.java:107) 在 de.it_p.pvlight.share.util.JAXBUtilTest.addXmlRootAnnotationDynamicly(JAXBUtilTest.java:60) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 引起:java.lang.LinkageError:加载程序(sun/misc/Launcher$AppClassLoader 的实例):尝试重复名称的类定义:“de/it_p/pvlight/share/util/ClassA” 在 java.lang.ClassLoader.defineClass1(本机方法) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:800) 在 java.lang.ClassLoader.defineClass(ClassLoader.java:643) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 javassist.ClassPool.toClass2(ClassPool.java:1112) 在 javassist.ClassPool.toClass(ClassPool.java:1093) ... 15 更多
【问题讨论】:
标签: java annotations javassist