相关疑难解决方法(0)

如何在Java中更改默认类加载器?

假设我有三个类,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的上下文类加载器设置为自定义类?

java class classloader

13
推荐指数
1
解决办法
2万
查看次数

什么是共享对象文件?

以详细模式运行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之后的任何方式我发现它具有从共享对象文件加载的所有类.

java jvm

5
推荐指数
1
解决办法
2086
查看次数

标签 统计

java ×2

class ×1

classloader ×1

jvm ×1