Adding annotation to a generated runtime class using Javassist

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
{
    //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;

}

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

+4
1

:

: "de/it_p/pvlight/share/util/ClassA"

addXmlRootAnnotationDynamicly . . Java, ClassLoader .

pool.getCtClass String Class CtClass es, Class es. , :

  • addXmlRootAnnotationDynamicly(String) de.it_p.pvlight.share.util.ClassA . , , . , , . Class cc.toClass().
  • ( ), . , .
  • Instrumentation API, .
  • , ClassLoader s. ( )
+11

Source: https://habr.com/ru/post/1538359/


All Articles