JAVA系列:类加载器介绍

目录

类加载器

4类加载器

启动类加载器(Bootstrap ClassLoader):

扩展类加载器(Extension ClassLoader):

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

自定义类加载器(User Defined ClassLoader):


类加载器

类加载器(ClassLoader)用来加载 class字节码到Java 虚拟机中

一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 Java 字节码文件(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每一个这样的实例用来表示一个 Java 类。实际的情况可能更加复杂,比如 Java 字节代码可能是通过工具动态生成的,也可能是通过网络下载。

 

即使这两个类来源于同一个class文件,只要加载它的类加载器不同,那这两个类必定不相等

 

 

4类加载器

JAVA系列:类加载器介绍_第1张图片

出来的是null了。其实也很好理解,Bootstrap ClassLoader以外的ClassLoader都是Java实现的,因此这些ClassLoader势必在Java堆中有一份实例在,所以Extension ClassLoader和Application ClassLoader都能打印出内容来。但是Bootstrap ClassLoader是JVM的一部分,是用C/C++写的,不属于Java,自然在Java堆中也没有自己的空间,所以就返回null了。所以,如果ClassLoader得到的是null,那么表示的ClassLoader就是Bootstrap ClassLoader。 

 

 

JAVA系列:类加载器介绍_第2张图片

启动类加载器(Bootstrap ClassLoader):

这是一个嵌在JVM内核中的加载器。它负责加载的是JAVA_HOME/lib下的类库,系统类加载器无法被Java程序直接应用

 

 

 

扩展类加载器(Extension ClassLoader):

这个类加载器由sun.misc.Launcher$ExtClassLoader实现,它负责用于加载JAVA_HOME/lib/ext目录中的,或者被java.ext.dirs系统变量指定所指定的路径中所有类库,开发者可以直接使用扩展类加载器。java.ext.dirs系统变量所指定的路径的可以通过程序来查看。

JAVA系列:类加载器介绍_第3张图片

 

 

 

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

这个加载器由sun.misc.Launcher$AppClassLoader实现,它负责加载classpath对应的jar及目录。一般情况下这个就是程序中默认的类加载器。

 

编译一下rt.jar,找到sun.misc.Launcher看一下Application ClassLoader的实现

 

JAVA系列:类加载器介绍_第4张图片

Application ClassLoader只会加载java.class.path下的.class文件,java.class.path代表的是什么路径?打印一下:

JAVA系列:类加载器介绍_第5张图片

 

JAVA系列:类加载器介绍_第6张图片

 

自定义类加载器(User Defined ClassLoader):

开发人员继承ClassLoader抽象类自行实现的类加载器,基于自行开发的ClassLoader可用于并非加载classpath中(例如从网络上下载的jar或二进制字节码)、还可以在加载class文件之前做些小动作 如:加密等。

自定义类的应用场景

(1)加密:Java代码可以轻易的被反编译,如果你需要把自己的代码进行加密以防止反编译,可以先将编译后的代码用某种加密算法加密,类加密后就不能再用Java的ClassLoader去加载类了,这时就需要自定义ClassLoader在加载类的时候先解密类,然后再加载。

(2)从非标准的来源加载代码:如果你的字节码是放在数据库、甚至是在云端,就可以自定义类加载器,从指定的来源加载类。

(3)以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节码,为了安全性,这些字节码经过了加密处理。这个时候你就需要自定义类加载器来从某个网络地址上读取加密后的字节代码,接着进行解密和验证,最后定义出在Java虚拟机中运行的类。

由用户自定义的类加载器加载的类是可以被卸载的。根类加载器、扩展类加载器和系统类加载器在虚拟机的生命周期中,始终不会被卸载.

 

 

 

 

 

你可能感兴趣的:(JAVA)