反序列化动态加载的java类

反序列化动态加载的java类,java,jar,classloader,classnotfoundexception,objectinputstream,Java,Jar,Classloader,Classnotfoundexception,Objectinputstream,我使用URLClassLoader从jarfile加载类,然后序列化这些类的对象并将其保存在文件中。然后,当我去反序列化类时,ObjectInputStream抛出一个java.lang.ClassNotFoundException,它没有找到我动态加载的类。如何反序列化装入的类?要使用自定义类装入器,必须重写resolveClass方法。下面是一个来自JDK源代码的示例(它不是公开的,但您可以使用它来获得灵感) apache commons在org.apache.commons.io.inpu

我使用URLClassLoader从jarfile加载类,然后序列化这些类的对象并将其保存在文件中。然后,当我去反序列化类时,ObjectInputStream抛出一个java.lang.ClassNotFoundException,它没有找到我动态加载的类。如何反序列化装入的类?

要使用自定义类装入器,必须重写resolveClass方法。下面是一个来自JDK源代码的示例(它不是公开的,但您可以使用它来获得灵感)


apache commons在org.apache.commons.io.input.ClassLoaderObjectInputStream中提供了这一功能。代码与peter的建议相同,但是是公开的

从javadocs:

一种特殊的ObjectInputStream,根据指定的 类加载器,而不是系统默认值

这在动态容器环境中非常有用


你需要在一个知道如何找到这些类的上下文中反序列化这些类。我该怎么做?我已经查看了ObjectInputStream的文档,但找不到类似的内容。谢谢,这正是我所需要的,我为此使用了基本框架,并修改了resolve类方法,使其具有“return class.forName(classDesc.getName(),false,loader);”而且效果很好,谢谢!
/**
 * This subclass of ObjectInputStream delegates loading of classes to
 * an existing ClassLoader.
 */

class ObjectInputStreamWithLoader extends ObjectInputStream
{
    private ClassLoader loader;

    /**
     * Loader must be non-null;
     */

    public ObjectInputStreamWithLoader(InputStream in, ClassLoader loader)
            throws IOException, StreamCorruptedException {

        super(in);
        if (loader == null) {
            throw new IllegalArgumentException("Illegal null argument to ObjectInputStreamWithLoader");
        }
        this.loader = loader;
    }

    /**
     * Use the given ClassLoader rather than using the system class
     */
    @SuppressWarnings("rawtypes")
    protected Class resolveClass(ObjectStreamClass classDesc)
        throws IOException, ClassNotFoundException {

        String cname = classDesc.getName();
        return ClassFinder.resolveClass(cname, this.loader);
    }
}