@Evilsylvana 我的classLoader是自定义的,为了重写findClass实现从远端加载byteCode
我也是自定了的Classloader加载特定的class,之前遇到这个问题是因为构造方法中没有调用super(parent); 。当指定了父加载器对象为LaunchedURLClassLoader对象时就可以找到所有的类了。那为什么是这个对象呢?因为是在Springboot2中,就是这个类加载器代替了原来的Application Classloader。
// 取当前类的类加器对象,构造自定义类加载器的时候,传入这个对象作为父类 var launchedURLClassLoader = this.getClass().getClassLoader();
class MonkeyClassLoader extends ClassLoader {
private static final String NAME = "Monkey";
private byte[] classBytes;
public MonkeyClassLoader(ClassLoader parent, byte[] classBytes) {
super(parent);
this.classBytes = classBytes;
}
@Override
protected Class> findClass(String name) throws ClassNotFoundException {
if (classBytes == null) {
return super.findClass(name);
}
final Class> aClass = defineClass(name, classBytes, 0, classBytes.length);
classBytes = null;
return aClass;
}
@Override
public String getName() {
return NAME;
}
}