区块链技术博客
www.b2bchain.cn

java类加载器加载器层次结构中同一级别的两个类加载器(假设两者都是URLClassLoader)如何加载类 – java程序员分享

本文介绍了java类加载器加载器层次结构中同一级别的两个类加载器(假设两者都是URLClassLoader)如何加载类 – java程序员分享,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

最近,我开始学习Java中类加载器的工作原理。以下是我观察到的三点:

要点1:每个类加载器都有一个父类加载器。当要求类加载器加载类或资源时,它会在尝试加载项目本身之前先咨询其父类加载器。父级依次咨询其父级,依此类推。因此,只有在所有祖先类加载器都找不到当前类加载器涉及的项目之后。

点2:由两个加载程序加载的同一类被视为两个不同的类实体。我们甚至无法将一个类(加载器1)对象转换为另一类(由loader2加载)。它将抛出ClassCastException。

第三点:子类加载器可以检查父类加载器的缓存,但父类看不到已加载的类
由孩子。

基于以上几点,我有两个问题:

情况:我在同一应用程序中创建了一个URLClassloader对象url1和另一个URLClassloader对象url2。我们知道默认情况下,两个类加载器都将具有相同的父类加载器。只需假设父类加载器是SystemClassLoader。

问题1:url1类加载器已从位置x / abc.jar加载了类A.class。再次url2想从相同的加载相同的类
位置。 url2将重新加载还是使用url1加载的相同URL?我试图检查一次,只有执行了静态块,所以被信任的类仅被加载一次。根据我的理解,这不满足Point-1和Point-3的要求。

问题2:url2类加载器是否可以检查url1类加载器的缓存。与第3点有关。

参考方案

类加载器是完全独立的,因此您将获得两个不同的类。

由于您没有发布MCVE(最小,完整和可验证的示例),因此这里使用的是任意选择的.jar文件。

public static void main(String[] args) throws Exception {     String jarFile = "/path/to/commons-lang3-3.8.1.jar";      URLClassLoader url1 = new URLClassLoader(new URL[] { new File(jarFile).toURI().toURL() });     URLClassLoader url2 = new URLClassLoader(new URL[] { new File(jarFile).toURI().toURL() });      Class<?> fractionClass1 = url1.loadClass("org.apache.commons.lang3.math.Fraction");     Class<?> fractionClass2 = url2.loadClass("org.apache.commons.lang3.math.Fraction");      Object oneHalf1 = fractionClass1.getField("ONE_HALF").get(null);     Object oneHalf2 = fractionClass2.getField("ONE_HALF").get(null);      System.out.println("url1 = " + url1);     System.out.println("url2 = " + url2);     System.out.println(" Same? " + (url1 == url2));     System.out.println("fractionClass1 = " + fractionClass1);     System.out.println("fractionClass2 = " + fractionClass2);     System.out.println(" Same? " + (fractionClass1 == fractionClass2));     System.out.println("oneHalf1 = " + oneHalf1);     System.out.println("oneHalf2 = " + oneHalf2);     System.out.println(" Same? " + (oneHalf1 == oneHalf2)); } 

输出量

url1 = [email protected] url2 = [email protected]  Same? false fractionClass1 = class org.apache.commons.lang3.math.Fraction fractionClass2 = class org.apache.commons.lang3.math.Fraction  Same? false oneHalf1 = 1/2 oneHalf2 = 1/2  Same? false 

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

我正在使用Retrofit来获取JSON答复。这是我实施的一部分("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…

我在理解这一点上遇到了问题。当我们做 List<Integer> list = Arrays.asList(array); 我们不能在该列表上使用添加,删除之类的方法。我知道Arrays.asList()返回固定大小的列表。我不明白的是,如果我们创建一个具有指定初始容量的列表,例如List<Integer> list2 = new A…

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » java类加载器加载器层次结构中同一级别的两个类加载器(假设两者都是URLClassLoader)如何加载类 – java程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们