[jboss-dev-forums] [Javassist Development] - Newbie question: How do you modify class members?

Jason Perrone do-not-reply at jboss.com
Tue Mar 29 14:35:20 EDT 2011


Jason Perrone [http://community.jboss.org/people/jasonperrone] created the discussion

"Newbie question: How do you modify class members?"

To view the discussion, visit: http://community.jboss.org/message/596347#596347

--------------------------------------------------------------
Ok, I understand how to modify a class. I've obtained my CtClass from the ClassPool and I added a new member.  Great. What I don't understand is how to replace the old version of this class in this ClassPool with the new version.  This may be a basic mis-understanding of the JVM on my part.  My understanding is that once you load a class, whether from a file or a class you constructed in the application, that that's it. It's there and you can't get rid of it.  So, if I have a class called Potato in the ClassPool, and I get Potato:

CtClass ctClass = cp.get("Potato")

And then I add a member to this class. .. ctClass.addField(f);
I don't understand how to get the changed version of the class into the classpool. After my change above, Potato in the classpool is not modified.  I thought it would be.  But in reading about Javassist, it seems that you have to make a new class from the change by calling toClass on CtClass, but I can't call toClass on the CtClass because a class of that same name already exists in the ClassPool.  Actually, the exact instructions from JavaAssist are:
     1) Get the class from the classpool
     2) Modify it
     3) Either use writeFile(not applicable to me) to call toByteCode to get the new class definition.  Ok, so I call toByteCode and get my new class definition (Potato with the new field). I figured that I then need to call defineClass() on the ClassLoader with the new byteCode but once again, the error that I can't compile the class because a class of the same name already exists. 

So, when it comes to modifying a class, are you ever actually modifying the original class that was loaded, or are you just creating a new class that is cloned from the original class and then applying some changes to it?
--------------------------------------------------------------

Reply to this message by going to Community
[http://community.jboss.org/message/596347#596347]

Start a new discussion in Javassist Development at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2063]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-dev-forums/attachments/20110329/d5bf7e6b/attachment.html 


More information about the jboss-dev-forums mailing list