Object不是声明类异常的实例

时间:2014-04-22 18:29:10

标签: java class disk

我的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

1 个答案:

答案 0 :(得分:0)

如果方法和实例(如method.invoke(instance, args))不在同一个类加载器中,则Method.invoke方法将抛出此异常。

例如,如果您在应用程序中生成一个对象,然后将其传递给具有自己的类加载器的线程,并尝试从该线程生成一个方法来调用您的对象,您将收到该异常。

在您的情况下,您说您使用自定义类加载器加载了类,因此我怀疑您没有使用该自定义类加载器来创建Method对象。