软件编程
位置:首页>> 软件编程>> java编程>> java中类加载与双亲委派机制详解

java中类加载与双亲委派机制详解

作者:超的博客  发布时间:2023-12-07 06:34:53 

标签:java,类加载,双亲,委派,机制

类加载是什么

把磁盘中的java文件加载到内存中的过程叫做类加载

当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM. 有如下 User 类

package dc.dccmmtop;
public Class User {
   public static void main(String[] args) {
       System.out.println("hello");
   }
}

运行 java dc.dccmmtop.User 时, 先要找到 User.Class 文件,查找全路径就是 Class_PATH + {{package name}},对于User类来说,就是 {$Class_APTH}/dc/dccmmtop.User.Class

假如 User.java 在F:\code, 并且不在Class_PATH 下,可以通过 java -Classpath "F:\code" 临时指定。

加载类之后还有后续的步骤:

  • 验证

  • 准备

  • 解析

  • 初始化

  • 使用

  • 卸载

这篇文章主要来讲讲类加载

类加载器

不了解类加载机制的,可能就认为,只需找到java文件所在的磁盘位置,然后进行一次读文件的操作不就完成了加载嘛,其实远非如此。

总有一个加载类的工具,这个工具叫做类加载器,在java代码中可以通过如下方式获取当前类的类加载器是什么

package dccmmtop;  

public Class User {  
   public static void main(String[] args) {  
       System.out.println("hello");  
       System.out.println(User.Class.getClassLoader());
   }  
}

java中类加载与双亲委派机制详解

如图可以看到类加载器的名字叫做 AppClassLoader

我们全局搜索一下这个类,会发现在 sun.misc.Launcher.java 文件中找到。 

java中类加载与双亲委派机制详解

那么这个AppClassLoader 本身也是一个 java 文件,它又是什么时候被加载并初始化的呢?

我们滚动到文件顶部,看到 Launcher 类的构造方法部分:

java中类加载与双亲委派机制详解

标记1 和标记2 实现了一个单例模式,在5 处获取到了 AppClassLoader 实例。也就是说在某一个地方通过调用 Launcher 类中的 getLauncher() 方法,会得到 AppClassLoader 实例, 那么 getLauncher() 方法又是在哪里调用的呢?追踪到这里已经无法在java代码中找到上一步了,其实这个方法是jvm (c++实现)调用的,如下图:

java中类加载与双亲委派机制详解

来源:https://juejin.cn/post/7133102820983013390

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com