自定义 Java 类装入器不用于装入依赖项?示例子第一类加载器更高级的类加载
我一直在尝试设置一个自定义类装入器,该类加载器拦截类以打印出哪些类正在加载到应用程序中。类装入器如下所示
public class MyClassLoader extends ClassLoader {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
System.out.println("Loading: " + name);
return super.loadClass(name);
}
}
它只是吐出它加载的所有类的名称。但是,当我尝试运行一些代码时,
import org.python.util.PythonInterpreter;
public class Scripts {
public String main(){
PythonInterpreter p = new PythonInterpreter();
p.exec("print 'Python ' + open('.gitignore').read()");
return "Success! Nothing broke";
}
}
通过
MyClassLoader bcl = new MyClassLoader();
Class c = bcl.loadClass("Scripts");
Method m = c.getMethod("main");
String result = (String) m.invoke(c.getConstructor().newInstance());
它打印出来
Loading: Scripts
Loading: java.lang.Object
Loading: java.lang.String
Loading: org.python.util.PythonInterpreter
Python build/
.idea/*
*.iml
RESULT: Success! Nothing broke
这似乎很奇怪。 不是一个简单的类,它依赖于包中的一大堆其他类。这些类显然正在加载,因为'd python代码能够做一些事情并读取我的文件。但是,由于某种原因,这些类不是由加载 的类加载器加载的。org.python.util.PythonInterpreter
org.python.util
exec
PythonInterpreter
为什么?我的印象是,用于加载类的类装入器将用于装入 所需的所有其他类,但这显然不会在这里发生。这个假设是错误的吗?如果是,我如何设置它,以便所有可传递的依赖项都由我的类加载器加载?C
C
C
编辑:
一些使用的实验,有人建议这样做。我修改了委派:URLClassLoader
loadClass()
try{
byte[] output = IOUtils.toByteArray(this.getResourceAsStream(name));
return instrument(defineClass(name, output, 0, output.length));
}catch(Exception e){
return instrument(super.loadClass(name));
}
以及使MyClassLoader子类URLClassLoader而不是普通的ClassLoader,通过以下方式获取URL:
super(((URLClassLoader)ClassLoader.getSystemClassLoader()).getURLs());
但这似乎不是正确的事情。特别是,对于我请求的所有类,甚至是像Jython lib这样的非系统类,都会向我抛出null。getResourceAsStream()