[jboss-user] [Javassist] New message: "Re: cannot access added Field in some cases. Please help."

Arvind K do-not-reply at jboss.com
Fri Feb 5 05:36:43 EST 2010


User development,

A new message was posted in the thread "cannot access added Field in some cases. Please help.":

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

Author  : Arvind K
Profile : http://community.jboss.org/people/megalodon

Message:
--------------------------------------------------------------
Hello Jaikiran,
 
I do not think that the class with the issue has already been loaded. In my first post, I mentioned that I am using java.lang.instrument API to do the loading and transformation initiation for me. The ClassFileTransformer hands me the bytecode of the class and I convert that into a CtClass object using CtClass.makeClassIfNew() and perform my transformations. I then hand over the modified bytecode back to the classfiletransformer to complete the loading process.
 
You are right that I am not in a position to post all of my code as-is mainly because I do not know where the issue(s) lies and that it might be voluminous if I post everything and of course I do not own it to post it  but I would be happy to provice snippets of some main parts for clarity. Here is the method in question where I do my simple modifications. I call this method for every method of the class I am instrumenting but add the int field 'abc' to the class while instrumenting the first method only.
 
protected void prefixMethod(CtMethod myCtM, String methodName) {
     try {
     if (fieldsAdded == false)
     {
         CtField tempCtF = new CtField(CtClass.intType, "abc",this.CtC); //myCtM is a method in this.CtC
          tempCtF.setModifiers(Modifier.PUBLIC);
          this.CtC.addField(tempCtF,"10");
          displayFields(false); // displays all the fields in this.CtC. Field 'abc' shows up here always.
          Log2File.write("Added Fields");
          // this.CtC.rebuildClassFile(); // i thought this function might solve the issue but it did not
          tempCtF = this.CtC.getField("abc"); // just a precaution
     }
     myCtM.insertBefore("System.out.println(\"In " + this.className + "." + methodName + ". abc is \" + this.abc);");
     } catch (CannotCompileException cce) {
          System.out.println("prefixMethod for " + className + " method name " + methodName + ". Exception: " + cce);
          cce.printStackTrace();
          Log2File.writeErr(cce,"prefixMethod for " + className);
     }
     catch (NotFoundException ntfnde) {
          System.out.println("prefixMethod for " + className + " method name " + methodName + ". Exception: " + ntfnde);
          ntfnde.printStackTrace();
          Log2File.writeErr(ntfnde,"prefixMethod for " + className);
     }
}

 
*Another twist is that, it works for a few methods in a class but not others in the same class*. I do not know what made the difference there. I have a suspision that it works for non-empty methods and not empty ones but I am not sure. I tried skipping the empty ones with CtMethod.isEmpty() but I couldn't seem to skip them.
 
Appreciate your help so far.
 
-Arvind

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

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




More information about the jboss-user mailing list