【发布时间】:2019-05-10 04:13:16
【问题描述】:
最近我开始学习类加载器在 Java 中的工作原理。以下是我观察到的三点:
Point-1:每个类加载器都有一个父类加载器。当要求类加载器加载类或资源时,它会在尝试加载项目本身之前咨询其父类加载器。父级依次咨询其父级,依此类推。所以只有在所有祖先类加载器都找不到当前类加载器参与的项目之后。
Point-2:两个加载器加载的同一个类被视为两个不同的类实体。我们甚至不能将一个类(加载器 1)对象转换为另一个类(由 loader2 加载)。它会抛出 ClassCastException。
Point-3:子类加载器可以检查父类加载器的缓存,但是父类看不到加载的类 由孩子。
基于以上几点,我有两个问题:
情况: 我在同一个应用程序中创建了一个 URLClassloader 对象 url1 和另一个 URLClassloader 对象 url2。正如我们所知,默认情况下,两个类加载器都将具有相同的父类加载器。假设这里的父类加载器是 SystemClassLoader。
问题 1: url1 类加载器从位置 x/abc.jar 加载了一个类 A.class。再次 url2 想从同一个类加载同一个类 地点。 url2 会重新加载还是使用 url1 加载的相同?我试图检查,只有一次静态块被执行,所以相信的类只被加载一次。据我了解,这不满足第 1 点和第 3 点。
问题2: url2 类加载器是否可以检查url1 类加载器的缓存。与第 3 点有关。
【问题讨论】:
标签: java classloader