I've found how to make the ClassFile working for defining my new class, but I'm 
still unable to add the annotation. Now I work as follows:
1) I create a CtClass object and set the inheritance chain on that;
2) I get the byte[] from the CtClass and place them into a 
ByteArrayInputStream, used to create a ClassFile;
3) I add the annotation to the classfile;
4) I get the byte[] from the classfile thru a ByteArrayOutputStream;
5) I load the class thru the defineClass method.

Now the class is of the right type, but it has no the annotation.
The following is my code; anyone has an idea of which is my error adding the 
annotation?


  |                 subProxyClassName += this.getSubClassNameSuffix();
  |                 
  |                 // make a new class and prepare the annotation
  |                 CtClass newProxyClass = pool.makeClass(subProxyClassName);
  |                 newProxyClass.setSuperclass( baseProxyClass );
  |                 ByteArrayInputStream is = new ByteArrayInputStream( 
newProxyClass.toBytecode() );
  |                 DataInputStream dis = new DataInputStream( is );
  |                 ClassFile classFile = new ClassFile( dis );
  |                 newProxyClass.defrost();
  |                 ConstPool constantPool = classFile.getConstPool();
  |                 AnnotationsAttribute attribute = new AnnotationsAttribute( 
constantPool, AnnotationsAttribute.visibleTag );
  |                 javassist.bytecode.annotation.Annotation annotation = new 
javassist.bytecode.annotation.Annotation( this.annotationClassName, 
constantPool );
  |                 attribute.setAnnotation( annotation );
  |                 classFile.addAttribute( attribute );
  |                 classFile.setVersionToJava5();
  |                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
  |                 DataOutputStream os = new DataOutputStream( bos );
  |                 classFile.write( os );
  | new javassist.bytecode.annotation.Annotation( constantPool, subProxy );
  |                 bytecode = bos.toByteArray();
  |                 baseProxyClass = null;
  |                 
  | ...             
  | 
  |                 Class clazz = this.defineClass(subProxyClassName, bytecode, 
0, bytecode.length);
  | 
  | 

Thanks,
Luca

View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4133098#4133098

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4133098
_______________________________________________
jboss-user mailing list
jboss-user@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to