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文件,
也就是加载方式可以完全由自己来定义。