在 java 中动态加载 class 及其对象

Dynamically load a class and its object in java

我有一个 class 文件和一个 class 的已保存对象。我的 java 应用程序的库中没有 class。当我尝试使用 ObjectInputStream, it gives an 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() 是我创建的一种读取对象的方法,它适用于我的库中具有 classes 的其他对象。

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

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 是 class 文件的路径。

并获取对象如下。

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