Class字节码的加载

提到Class的加载,就不得不提到ClassLoader,因为java加载类就是靠它加载的,它负责读取字节码的字节流进行加载。

ClassLoader的继承关系是从BootStrapClassLoader开始的,也是由它最先加载类,然后是ExtClassLoader,接下来是AppClassLoder(应用程序默认的),

最后是用户自己的ClassLoader(通常在容器下编写代码,都是由容器自定义创建的ClassLoader创建的类)。下面简单介绍一下他们的用途。

1、BootStrapClassLoader

BootStrapClassLoder主要用于加载一些java自带的核心类(例如java.lang.*),通常这些核心类的Class被签名,不能被替换掉,它是由JVM内核实现的,

在Hotspot VM中用C++实现的,有了它加载最核心的内容,才会有后面的ClassLoader的存在。

2、ExtClassLoader

ExtClassLoader是加载在jre/lib/ext/目录下的jar包,用户也可以自己将jar包放到这个目录下,通过这个ClassLoader来加载。

3、AppClassLoader

AppClassLoader也是用户可见的ClassLoader,它加载的是classpath下面的内容,也就是和classpath相关的类,在默认情况下都由它来加载。

4、自定义的ClassLoader

用户自定义的ClassLoader要加载的内容可能不在系统的classpath范围内(也可以在这个范围内),甚至不是Class文件或jar文件,

也就是加载方式可以完全由自己来定义。

原文地址:https://www.cnblogs.com/wangpin/p/8080508.html