I'm using javassist to add some functionality to a third-party program.
I'm trying to insert some code into the constructor of my target class which
calls methods elsewhere in the program to set fields in the target class.
An object passed to my target constructor has a private field whose members are
the members I want to call. Since the field is private, I can't call the
members directly. I'm therefore using standard java reflection to get access
to the field's methods and to call them.
If I take the original target class source, add the code at the end of the
constructor and run it works just fine. However, if I use code insertion
via javassist insert the *same* code at the end of the constructor, I get an
error:
Java.lang.VerifyError:
com.companyX.moduleY.MyTargetClass, method
signature(LcompanyX/moduleY/DataClass;)V Expecting to find integer on stack.
Here's the code I'm inserting:
| try {
| java.lang.reflect.Field
f=this.dataField.getClass().getDeclaredField("privateData");
| f.setAccessible(true);
| Object o=f.get(this.dataField);
| java.lang.reflect.Method
meth=o.getClass().getDeclaredMethod("getRSquared",(Class[])null);
| meth.setAccessible(true);
|
| this.rSquare=(Float)meth.invoke(o,(Object[])null);
|
| } except (Exception e) {
| }
|
|
Now, if I comment out the meth.invoke line, it runs just fine, but that defeats
the point of the whole exercise. Again, if I insert this code into the
original class source things work as expected. I only get the VerifyError when
the method is inserted via javassist.
So, any suggestions? Has anyone gotten reflection to work inside inserted code
to the point where they can call methods via reflection?
Thanks.
View the original post :
http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4224251#4224251
Reply to the post :
http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4224251
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user