在java

时间:2015-05-07 16:03:41

标签: java classloader objectinputstream

我有一个类文件和该类的保存对象。我的java应用程序在其库中没有该类。当我尝试使用ObjectInputStream加载对象时,它会提供ClassNotFoundException

然后我使用以下代码。

 URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.getParentFile().toURI().toURL()});
 classLoader.loadClass(classFile.getName().replace(".class", "")).newInstance();
 myClass= (MyClass) FileIOManager.readObject(classObj);

但是这段代码在读取对象时也给了我相同的异常。希望能帮助我完成任务..

MyClass 没有包名。

FileIOManager.readObject()是我为读取对象而创建的一个方法,它适用于在我的库中有类的其他对象。

1 个答案:

答案 0 :(得分:0)

我将我创建的readObject()类中的FileIOManager方法更改为以下内容。

public static Serializable readObject(String path) throws FileNotFoundException, IOException, ClassNotFoundException {
    return readObject(path, null);
}

public static Serializable readObject(String path, final ClassLoader classLoader) throws FileNotFoundException, IOException, ClassNotFoundException {
    Serializable obj;
    try (FileInputStream fis = new FileInputStream(path); ObjectInputStream ois = new ObjectInputStream(fis) {

        @Override
        protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
            if (classLoader == null) {
                return super.resolveClass(desc);
            }
            return Class.forName(desc.getName(), false, classLoader);
        }

    }) {
        obj = (Serializable) ois.readObject();
    }
    return obj;
}

此处path是类文件的路径。

获取对象如下。

URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.getParentFile().toURI().toURL()});
myClass = (MyClass) FileIOManager.readObject(loc, classLoader);