JAVA学习之JVM加载class

时间:2022-06-29 19:38:34

1.java中的所有类,必须被装载到JVM中才能运行,这个装载工作是由JVM中的类加载器完成的,类加载器所做的工作实质是就是将类加载到JVM中。
2.java中部高的类大致分为三种:
1)系统类
2)扩展类
3)由程序员自定义的类
3.类装载方式分为两种:
1)隐式装载:程序在运行过程中当遇到通过new()等方式生成对象时,隐式调用类加载器加载对应的类到JVM中;
2)显式装载:通过class.forname()等方法,显式加载需要的类;
4.java类加载器:三层结构
     Bootstrap Loader--负责加载系统类
         |
       --ExtClassLoader--负责加载扩展类
             |
           --AppClassLoader--负责加载应用类

在这里java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”。

Public class Test{
Public static void main(String[] arg){
ClassLoader c = Test.class.getClassLoader(); //获取Test类的类加载器
System.out.println(c);

ClassLoader c1 = c.getParent(); //获取c这个类加载器的父类加载器
System.out.println(c1);

ClassLoader c2 = c1.getParent();//获取c1这个类加载器的父类加载器
System.out.println(c2);
}
}

运行结果:
    AppClassLoader
    ExtClassLoader
    Null
由于Bootstrap Loader是用C++语言写的,依java的观点来看,逻辑上并不存在Bootstrap Loader的类实体,所以在java程序代码里试图打印出其内容时,我们就会看到输出为null。

5.JVM加载class文件的原理机制:
1)装载:查找和导入Class文件
2)链接:检查文件是否正确,给变量分配空间,将符号引用转成直接引用;
3)初始化:对静态变量,静态代码块执行初始化工作;
类装载器ClassLoader是一个抽象类,类装载工作由ClassLoader和其子类负责,会产生三个ClassLoader:根装载器。ExtClassLoader、AppClassLoader;其中,根目录不是ClassLoader的子类,负责装载JRE的核心类库;ExtClassLoader是ClassLoader的子类,负责装载JRE扩展目录ext下得jar类包;AppClassLoader是ExtClassLoader的子类,负责装载classpath路径下得类包。