【发布时间】:2018-10-03 20:20:47
【问题描述】:
我正在学习加载java类的过程,遇到了一些困惑。
我知道在加载 java 类 时,current classLoader 不会直接加载 java 类,它会委托给它的 父类classLoader(一个递归过程)直到它的父级不能加载这个类。
问题是:当前的classLoader是什么? Bootstrap?扩大?应用程序?
如何获取当前的类加载器?。
我知道有一个 API:
xxx.Class.getClassLoader();
但我不确定返回值是否为currentClassLoader。我认为实际上应该是加载这个java类的classLoader。
为了更详细地描述我的问题,我将举一个例子。
我在博客中获得以下内容。
ThreadContextClassLoader用于处理java SPI,接口在java
core lib中定义,由Bootstrap ClassLoader和第三方实现加载AppClassLoader
解决办法:传统的classLoader无法处理这种情况,因为我们在使用第三方时无法发现第三方jar在核心库中实现。
以上大部分内容我都能理解,但解决方案让我感到困惑:
例如,接口 CoreA 和类 CoreB 在 java core lib 中,应该由 Bootstrap ClassLoader 和 AImpl是第三方A的实现,应该由AppClass loader加载。
代码段如下:
public Interface CoreA{
void add();
}
public Interface AImpl implements CoreA{
void add(){};
}
public class B{
public void demo(){
a = new AImpl();
}
}
那么如果我们在main method 中引用B,那么我们将加载B,因为B 的类加载器 是Bootstrap 然后大约是@987654329 @ 当前的 Loader 是 Bootstrap 所以找不到?
不知道是不是和我猜的一样?
我们将不胜感激。
【问题讨论】:
-
不同的环境使用不同的类加载策略。默认是先将类加载请求传播到父类加载器。如果无法加载类,这个类加载器会尝试加载它。但是,一些应用服务器类加载器不会先询问它们的父类加载器,如果它们能够自己加载类。接下来,在 OSGi 中还有更复杂的类加载器魔法来实现模块系统。
-
没有“当前类加载器”这样的东西。每个类都由特定的 ClassLoader 加载。就是这样。
-
有时我会遇到术语
current classloader,这很好,它只是当前执行类的classloader。
标签: java jvm classloader