以下是报错源码
public class MyClassLoader extends ClassLoader {
private File classPathFile;
public MyClassLoader() {
String path = MyClassLoader.class.getResource("").getPath();
this.classPathFile = new File(path);
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String className = MyClassLoader.class.getPackage().getName() + "." + name;
if (classPathFile != null) {
//这里出现错误,classloader只能加载.class文件
File classFile = new File(classPathFile, name.replace(".", "\\") + ".java");
if (classFile.exists()) {
try (FileInputStream in = new FileInputStream(classFile);
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
byte[] bytes = new byte[1024];
int len;
while ((len = in.read(bytes)) != -1) {
out.write(bytes, 0, len);
}
return defineClass(className, out.toByteArray(), 0, out.size());
} catch (IOException e) {
e.printStackTrace();
}
}
}
return super.findClass(name);
}
}
在使用自定义classloader加载类时,由于粗心大意,出现了一点错误.
java.lang.ClassFormatError: Incompatible magic value 1885430635 in class file xxx
原因是不能使用ClassLoader加载java源码文件,就是.java文件,只能加载.class文件
因此上面需要修改
File classFile = new File(classPathFile, name.replace(".", "\\") + ".class");
关于如何动态创建类并加载到内存中可参考这里
版权声明:本文为ChlatZed原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。