反序列化动态加载的类java

时间:2016-01-26 12:23:09

标签: java jar classloader classnotfoundexception objectinputstream

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

2 个答案:

答案 0 :(得分:4)

要使用自定义ClassLoader,您必须覆盖resolveClass方法。以下是JDK源代码中的一个示例(不公开,但您可以将其用作灵感)

/**
 * 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);
    }
}

答案 1 :(得分:1)

apache commons在org.apache.commons.io.input.ClassLoaderObjectInputStream中提供了此功能。该代码与彼得建议的相同,但公开

来自javadocs:

  

特殊的ObjectInputStream,它基于指定的类加载类   ClassLoader,而不是系统默认值。

     

这在动态容器环境中很有用。