JVM-JVM加载class文件

Java程序中所有的class文件都需要加载至JVM中才能运行,加载行为由类加载器(Class Loader)完成。通常开发人员无需关心类加载(隐式装载),如遇反射等特殊用法则需显式加载所需的类。
 

类装载方式

  • 隐式装载:通过new等方式生成对象时,隐式调用类装载器加载对应的类到JVM中。
  • 显式装载:通过class.forname()等方法,显式加载所需的类到JVM中。
Java类的加载过程是动态的,不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到JVM中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。
 

类加载器介绍

 
Java类加载器有三个,对应Java的三种类 (系统类,扩展类,自定义类) 。 
 
  • Bootstrap Loader
负责加载系统类 (内置类,像是String,对应于C#中的System类和C/C++标准库中的类)
 
  • ExtClassLoader   
负责加载扩展类(继承类和实现类)
 
  • AppClassLoader   
负责加载应用类(程序员自定义的类)
 

委托模型机制

 
Java采用委托模型机制,实现三个加载器协同工作、加载各自的类、完成各自工作。
 
委托模型机制:当类加载器需要加载类的时,先请示其Parent(即上一层加载器)在其搜索路径载入,如果找不到,才在自己的搜索路径搜索该类。这样的顺序其实就是加载器层次上自顶而下的搜索,因为加载器必须保证基础类的加载。这种机制的设计是出于安全的考虑:如果某人将一个恶意的基础类加载到jvm,委托模型机制会搜索其父类加载器,显然是不可能找到的,自然就不会将该类加载进来。
 
获取类加载器
 
ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader ParentLoader = loader.getParent();

注意:Java在逻辑上并不存在Bootstrap Loader实体,因为它是用C++编写的,所以打印其内容将会得到null。

 

类加载器原理

1.装载:查找和导入class文件;
 
2.连接:
 
 (1)检查:检查载入的class文件数据的正确性;
 
 (2)准备:为类的静态变量分配存储空间;
 
 (3)解析:将符号引用转换成直接引用(这一步是可选的)
 
3.初始化:初始化静态变量、静态代码块。
 
 初始化过程在程序调用类的静态成员的时开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

猜你喜欢

转载自blog.csdn.net/A_bad_horse/article/details/106044709