[英]How do I use the Java ClassLoader to load a file fromthe classpath?
[英]What classloader does “new” use, and how do i change it?
我正在开发一个简单的插件系统,我基本上想控制哪个类加载器在new
指令上加载一个类。 例如,我的主程序有一个jar,我在一个名为Bar.jar
的额外打包jar中分发了一个类Foo.class
。
我看到在我的主程序中包含jar的三种不同的可能性:
Bar.jar
将它包含在类路径中。 对于插件系统来说,这显然是不可行的 Foo
。 这对于默认的java程序员来说太熟悉,无法通过名称手动加载类 -Djava.system.class.loader
参数将自定义类加载器设置为System-classloader。 但我真的不想强迫用户使用额外的参数启动他的应用程序。 还有另外一种方法吗? 也许是为特定类注册Custom类加载器的东西? 或者在运行时更改Classloader的new
用途? 设置Thread
的ContextClassLoader
不起作用。
加载类时,它引用的类使用与它相同的类加载器。 这意味着要隐式控制使用的类加载器,您可以使用不同的类加载器来启动它。 例如你的第一个Runnable。
class A {
B b = new B();
new B
将选择用于A(或父级)的ClassLoader
设置上下文类加载器适用于类似Class.forName(name);
动态查找Class.forName(name);
与Class.forName(Thread.currentThread().getContextClassLoader(), name);
一旦加载了类,它将始终使用它所依赖的相同类。 根据线程上下文说,不可能交换不同的类。 这意味着具有非常特定的类加载器的类可以使用更常用的类(例如,通用类来自父类),但是更常用的类不能使用它不知道的更具体的类加载器。 即ClassLoaders不知道他们的孩子。
其中一个原因是线程共享内存。 这意味着你不能说当A在一个线程中创建一个新B时,它将与另一个线程不同,因为任何一个线程都可以访问A实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.