java 虚拟机类加载

标签:

本文出自jvm123.com-java技术分享站:http://jvm123.com/2019/10/java-xu-ni-ji-lei.html

classLoader.loadClass(“com.jvm123.java.Person”)

Class.forName(“com.jvm123.java.Person”)

class.forName加载,会执行类中static代码块,类已经被初始化。

类加载器 ClassLoader

ClassLoader 是一个抽象类,其子类有:

启动类加载器(Bootstrap ClassLoader): BootstrapClassLoader

这个类加载器负责将\lib目录下的类库加载到虚拟机内存中,用来加载java的核心库(java.*),此类加载器并不继承于java.lang.ClassLoader,不能被java程序直接调用,代码是使用C++编写的.是虚拟机自身的一部分。

扩展类加载器(Extendsion ClassLoader): ExtClassLoader

这个类加载器负责加载\lib\ext目录下的类库,用来加载java的扩展库(javax.*),开发者可以直接使用这个类加载器。

应用程序类加载器(Application ClassLoader): AppClassLoader

这个类加载器负责加载用户类路径(CLASSPATH)下的类库,一般我们编写的java类都是由这个类加载器加载,这个类加载器是CLassLoader中的。getSystemClassLoader()方法的返回值,所以也称为系统类加载器。一般情况下这就是系统默认的类加载器。

自定义classLoader:

可以通过重写 findClass 方法来自定义加载的逻辑,findClass需要做两件事:

  1. 加载读取 *.class 字节码文件,转换为 byte[] 数组;
  2. 将 byte[] 数组转换为 Class<?> 对象。

其实通过重写这个方法,我们可以最字节码进行处理,比如加密解密等,防止被别人反编译。

双亲委派机制

java 虚拟机类加载插图
双亲委派机制

自下而上检查某个类是否已经被加载:

自定义类加载器如果没有加载某个类,就会去查找AppClassLoader是否加载,依次查找。

自上而下尝试加载某个类:

如果BootstrapClassLoader没有加载这个类,就会尝试从java.*加载,如果不能加载,就会尝试使用ExtClassLoader来加载。

发表评论