I use Javassist (Java 1.7) to add annotation to ClassA class, but get an exception. What am I doing wrong? The code I tried looks like this:
ClassA.java
public class ClassA
{
}
add method
public static <T> Class<T> addXmlRootAnnotationDynamicly(Class<T> declaredTyp) throws NotFoundException, CannotCompileException, InstantiationException, IllegalAccessException
{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.getCtClass(declaredTyp.getCanonicalName());
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);
cc.getClassFile().addAttribute(attr);
Class<T> dynamiqueBeanClass = cc.toClass();
return dynamiqueBeanClass;
}
call
Class<ClassA> addXmlRootAnnotationDynamicly = addXmlRootAnnotationDynamicly(ClassA.class);
An exception
javassist.CannotCompileException: by java.lang.LinkageError: loader ( 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) at sun.reflect.NativeMethodAccessorImpl.invoke0 ( ) java.lang.reflect.Method.invoke(Method.java:606) at sun.reflect.NativeMethodAccessorImpl.invoke0 ( ) java.lang.reflect.Method.invoke(Method.java:606) org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at 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: loader ( 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) at sun.reflect.NativeMethodAccessorImpl.invoke0 ( ) java.lang.reflect.Method.invoke(Method.java:606) javassist.ClassPool.toClass2 (ClassPool.java:1112) javassist.ClassPool.toClass(ClassPool.java:1093) ... 15