[jboss-user] [Javassist] New message: "problem adding annotations at runtime"

suresh inala do-not-reply at jboss.com
Fri Feb 19 04:20:35 EST 2010


User development,

A new message was posted in the thread "problem adding annotations at runtime":

http://community.jboss.org/message/527195#527195

Author  : suresh inala
Profile : http://community.jboss.org/people/inalasuresh

Message:
--------------------------------------------------------------
Hi One & All
 
 
I have a classfile called HelloWorldService with @WebServiceClient annotation. I want to use this classfile and need to be add one more annotation @HandlerChain using javaassist.
 
Code Snipped which I am working on.
 
When I am invoking the below code snipped I am getting only one annotation it is removing all the annotations and adding  the new one.
I am able to add annotation at runtime but it is adding only one annotation. But I want all the annotations? how to add multiple annotations?.
 
HelloWorldService.java
  
@WebServiceClient(name = "HelloWorldService")
*public* *class* HelloWorldService *extends* Service
{
}
 
Adding annotatins using javaassist
 
AddAnnotations.java
 
*public* *byte*[] makingAnnotationAtRuntime() *throws* Exception {
  
            ClassPool pool = ClassPool.+getDefault+();
            CtClass proxyClass = pool.get("HelloWorldService");
 
//get annotations from class called HelloWorldService
            Object[] all = proxyClass.getAnnotations();
            
            // get the class file and add the annotation
            ClassFile classFile = proxyClass.getClassFile();
            ConstPool constantPool = classFile.getConstPool();
            AnnotationsAttribute attr = *new* AnnotationsAttribute(constantPool,AnnotationsAttribute.+visibleTag+);
            Annotation annotation = *new* Annotation("javax.jws.HandlerChain", constantPool);
            annotation.addMemberValue("file", *new* StringMemberValue("HelloWorldService.xml",constantPool));
            attr.setAnnotation(annotation);
            proxyClass.getClassFile().addAttribute(attr);
            classFile.setVersionToJava5();
            // transform the classfile into bytecode
            ByteArrayOutputStream bos = *new* ByteArrayOutputStream();
            DataOutputStream os = *new* DataOutputStream(bos);
            classFile.write(os);
            os.close();
            
           //get annotations from Class
            all = proxyClass.getAnnotations();
            int i=0;
            for (Object object : all) {
                  System.out.println(all[i]);
                  i++;
            }
            
            *return* bos.toByteArray();
      }
  
When I run this I am getting the output : @javax.jws.HandlerChain(file="HelloWorldService_handler.xml")
  
But I want to get the other annotation as well. Original HelloWorldService Classfile contains @WebServiceClient(name = "HelloWorldService")
  
How can I get all annotations at run. Please suggest me I stuck to achieve this issue.
Please throw your thoughts.
 
 
*Thanks in Advance*
*        Suresh*

--------------------------------------------------------------

To reply to this message visit the message page: http://community.jboss.org/message/527195#527195




More information about the jboss-user mailing list