我的netbeans项目中有一个java类,它在我用javassist api添加到该类的同时实例化一个新方法,并加载了自定义类加载器,以便javassist创建了位于磁盘中的同一个类,所有过程都在运行时。 我希望那些旧对象通过反射调用新添加的方法。 我得到“对象不是声明类的实例”异常
请帮我解决这个问题。
序列化:
XStream xstream = new XStream(new DomDriver());
SinglyLinkedList theList = new SinglyLinkedList();
System.out.println("hello korat");
theList.header=new Entry();
theList.header.element=6;
theList.header.next=new Entry();
theList.header.next.element=6;
theList.header.next.next=new Entry();
theList.header.next.next.element=6;
theList.size=2;
File fichier = new File("SLL.xml");
FileOutputStream fos = new FileOutputStream(fichier);
try {
xstream.toXML(theList, fos);
} finally {
fos.close();
通过添加新方法使用javassist更改类:
ClassPool pool = ClassPool.getDefault();
Loader cl = new Loader(pool);
CtClass ctclass = pool.get("beans.SinglyLinkedList");
ctclass.stopPruning(true);
CtMethod newmethod = CtNewMethod.make("public void preF(int a){System.out.println(a);}",ctclass);
ctclass.addMethod(newmethod);
ctclass.writeFile();
Class clazz = cl.loadClass("beans.SinglyLinkedList");
Object nouvel =clazz.newInstance();
然后反序列化
xstream = new XStream(new DomDriver());
FileInputStream fis = new FileInputStream(new File("SLL.xml"));
try {
nouvel= xstream.fromXML(fis);
System.out.println(nouvel.toString());
clazz.cast(nouvel);
} finally {
fis.close();
}
我希望反序列化的对象调用新添加的方法:
喜欢:preF.invoke(nouvel,10);
但是我得到了这个例外:Object is not an instance of declaring class
答案 0 :(得分:0)
如果方法和实例(如method.invoke(instance, args)
)不在同一个类加载器中,则Method.invoke方法将抛出此异常。
例如,如果您在应用程序中生成一个对象,然后将其传递给具有自己的类加载器的线程,并尝试从该线程生成一个方法来调用您的对象,您将收到该异常。
在您的情况下,您说您使用自定义类加载器加载了类,因此我怀疑您没有使用该自定义类加载器来创建Method对象。