假设我有三个类,example.ClassA,example.ClassB和example.ClassLoader.ClassA打印出HelloWorld,ClassB导入example.ClassA并调用其main()方法.如果我这样做:
java -cp Example.jar -Djava.system.class.loader = example.ClassLoader example.ClassA
它工作并使用我的类加载器.但是,如果我这样做:
java -cp Example.jar -Djava.system.class.loader = example.ClassLoader example.ClassB
ClassB使用我的类加载器,但ClassA(由ClassB导入)使用默认的类加载器加载.
有没有办法强制Java总是使用我的类加载器(除非明确指定另一个类加载器)?
编辑:感谢下面的PaŭloEbermann的回答,我认为问题是我正在调用父类加载器(URLClassLoader)来加载我不需要触摸的类,并且那些加载的类设置为它的上下文类加载器,因此从它导入的类使用我的自定义加载器的父类加载器.(令人困惑,抱歉)现在我可以通过手动读取每个类来使它工作,但是它似乎是多余的,因为我直接复制了URLClassLoader的代码.有没有办法告诉父类加载器查找和定义类,但是将Class的上下文类加载器设置为自定义类?
以详细模式运行jvm时,它显示正在从共享对象文件加载文件,如下所示
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
Run Code Online (Sandbox Code Playgroud)
什么是共享对象文件?我以为这些是rt.jar中的文件,它从那里开始加载; 但是rt.jar在很长一段时间内被打开了
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Opened C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded sun.misc.JavaSecurityProtectionDomainAccess from C:\Program Files\Java\jre6\lib\rt.jar]
[Loaded java.security.ProtectionDomain$2 from C:\Program Files\Java\jre6\lib\rt.jar]
Run Code Online (Sandbox Code Playgroud)
在提取rt.jar之后的任何方式我发现它具有从共享对象文件加载的所有类.