0 Replies Latest reply on Jun 4, 2012 8:32 AM by cuginip

    Javassist seems to be stripping off existing annotations - why?

    cuginip

      Hello.   I'm trying to use Javassist in a jUnit test.   My objective is to create a dynamic class based on an existing class, for the purposes of dynamically adding an annotation.   In my test I'm also replacing the method body of one of the methods of the original class.   This basically seems to work.  However I've noticed something which is very annoying and which has hindered my progress.  It seems as though when javassist is creating the new class based on the specified original, all of the existing annotations on the existing class are stripped off in the new dynamic class created by Javassist.  This seems to be occurring even when my code doesn't include any modifications to the annotations on the original.  The only way I've seen to get around this is to re-add all of the annotations that need to be there, but this is very cumbersome.  The version of javassist I'm using is 3.12.   I'm wondering if this is a known issue, or if perhaps I'm doing something wrong that is causing this to happen. 

       

      Here is a snippet of my code:

       

      @Test

      public testCase {

      ...

      Class newClass = buildClassWithMethod(ExistingClass.class, "getRecordClass", "{return + dynamicBeanClass.getName() +  ".class";}");

      ...

      Method controlInitMethod = getInitMethod(ExistingClass.class);

      ExistingAnnotation controlExistingAnnotation = controlInitMethod.getAnnotation(ExistingAnnotation.class);

      Assert.assertNotNull(controlExistingAnnotation); // PASSES as expected.

      Method initMethod = getInitMethod(newClass);

      ExistingAnnotation existingAnnot = initMethod.getAnnotation(ExistingAnnotation.class);

      Assert.assertNotNull(existingAnnot); // FAILS!

      ...

      }

       

       

      private Class buildClassWithMethod(Class originalClass,

                                                           String newMethodName,

                                                           Stirng newMethodText) throws Exception {

      ClassPool pool = ClassPool.getDefault();

      Loader loader = new Loader(pool);

      pool.insertClassPath(new ClassClassPath(originalClass));

      CtClass cc = pool.getCtClass(originalClass.getName());

      CtMethod methodToReplace = cc.getDeclaredMethod(newMethodName);

      methodToReplace.setBody(newMethodText);

      ClassFile ccFile = cc.getClassFile();

      ConstPool constpool = ccFile.getConstPool();

      Class dynamicBeanClass = cc.toClass(loader, null);

      return dynamicBeanClass;

      }