类加载---加载

祖师爷:
jvm的类加载器的祖师爷是启动类加载器(boot class loader)。启动类加载器是由C++实现的,没有对应的java对象,因此在java中只能由null来指代。除了启动类加载器,其他的类加载器都是java.lang.ClassLoader的子类,所以他们有对应的java对象。这些类加载器需要先由另一个类加载器,比如说启动类加载器,加载到java虚拟机中,方能执行类加载器。

次基础的类加载器和功能—1.9版本以前:
启动类加载器加载最为基础、最为重要的类,比如JRE的lib目录下的jar包中的类,以及由虚拟机参数-Xbootclasspath指定的类。除了启动类加载器之外,另外2个重要的类加载器是扩展类加载器(extension class loader)和应用类加载器(application class loader)。扩展类加载器加载相对次要、通用的类,比如JRE的lib/ext目录下的类,以及由系统变量java.ext.dirs指定的类。应用类加载器负责加载应用程序路径下的类。比如虚拟机参数-cp/-classpath、系统变量java.class.path或者环境变量CLASSPATH所指定的路径。默认情况下应用程序中包含的类便是由应用类加载器加载的。

1.9版本以后:
java9引入了模块系统,并且略微更改了上述的雷家族群。扩展类加载器被改名为平台类加载器(platform class loader)。java SE 中除了少数几个关键模块,比如说java.base是由启动类加载器加载之外,其他的模块均由平台类加载器所加载。

加载规则:
jvm的类加载器有个规则叫双亲委派模型。每当一个类加载器收到加载请求时,他会先将请求转发给父类加载器。在父类加载器没有找到所请求的类的情况下,该类加载器才会尝试去加载。

自定义类加载器:
我们可以使用自定义类加载器,比如我们可以对class文件进行加密,加载时再利用自定义的加载器对其进行解密。

命名空间:
除了加载功能之外,类加载器还提供了命名空间的作用。在java虚拟机中,类的唯一性是由类加载器实例以及类的全名一同确定的。即便是同一串字节流,经由不同的类加载器加载,也会得到2个不同的类。在大型应用中,我们往往借助这一特性,来运行同一个类的不同版本。

类在加载阶段就已经生成class结构了,应该是已经被写入方法区,只是标记为未链接而暂不能使用

猜你喜欢

转载自blog.csdn.net/u011649691/article/details/81539572
今日推荐