在java中动态加载类及其对象
我有一个类文件和该类的一个保存对象。我的java应用程序的库中没有这个类。当我尝试使用加载对象时,它给出了一个 然后我使用下面的代码在java中动态加载类及其对象,java,classloader,objectinputstream,Java,Classloader,Objectinputstream,我有一个类文件和该类的一个保存对象。我的java应用程序的库中没有这个类。当我尝试使用加载对象时,它给出了一个 然后我使用下面的代码 URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.getParentFile().toURI().toURL()}); classLoader.loadClass(classFile.getName().replace(".class", "")).newInstance()
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()是我创建用于读取对象的方法,它适用于库中包含类的其他对象。我将创建的
FileIOManager
类中的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;
}
您需要提供类的完整限定名,包括包。否则,将出现此异常。该类是在没有包名称的情况下创建的。我想这不是问题所在。你确定你的ObjectInputStream正在使用你的类加载器吗?OIS倾向于忽略当前线程的类加载器,而使用系统类加载器。请核实。
URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.getParentFile().toURI().toURL()});
myClass = (MyClass) FileIOManager.readObject(loc, classLoader);