1、类加载器的作用
类加载器的作用是将class字节码文件加载到内存中,并将这些静态数据转化为方法区中的运行时数据结构,同时在堆中生成代表这个类的java.lang.Class对象,作为访问方法区中数据的入口。
2、类缓存
标准的Java SE类加载器可以按要求查找指定的类,但是一旦某个类被加载到指定的类加载器中,它将维持一段时间,不过,JVM垃圾回收机制可以回收这些Class对象,简单的说,类在被回收前,只被加载一次
3、类加载器的层次结构
*注意:
a、只有引导类加载器没有继承java.lang.ClassLoader
b、只有引导类加载器是用C++写的,其他的类加载都是用java写的
c、自定义类的加载器的父类是应用程序类加载器,应用程序类加载器的父类是拓展类类加载,拓展类类加载的父类是引导类加载器,引导类加载器没有父类
d、注意这里所说的父类并不是继承的关系,内部的采用的组合的方式实现的
————————————————————————————
1. 引导类加载器(bootstrap class loader)
作用:
1、加载Java的核心库(JAVA_HOME/jre/lib/rt.jar)或sun.boot.class.path路径下的内容
2、加载扩展类和应用程序类加载器,并指定他们的父类
3、它是由原生程序C++写的,并不继承java.lang.Classloader
通过程序获取sun.boot.class.path路径下的内容
@org.junit.Test
public void test() {
System.out.println(System.getProperty("sun.boot.class.path"));
}
程序执行结果:
2、扩展类加载器(Extensions class loader)
1、用来加载java的扩展库(JAVA_HOME/jre/ext/*.jar)或java.ext.dirs路径下的内容,Java虚拟机会提供一个扩展库目录,该类加载器在这里查找并加载java类
2、由sun.misc.Launcher$ExtClassLoader实现
3、应用程序类加载器(application class loader)
1、根据Java应用的类路径来加载类,一般来说Java应用的类都是由它来加载的
2、由sun.misc.Launcher$AppClassLoader实现
4、自定义类加载器
1、开发人员可以通过继承java.lang.ClassLoader类来定义自己的类加载器已满足一些特殊的需求
4、ClassLoader类介绍
作用
加载字节码文件并生成对应的java.lang.Class对象
加载Java应用所需要的资源,如图像和配置文件
相关方法
方法 | 解释 |
---|---|
getParent() | 返回该类加载器的父类加载器 |
loadClass(String name) | 加载返回名称为name的java.lang.Class实例 |
findClass(String name) | 找到并返回名称为name的java.lang.Class实例 |
findLoadedClass(String name) | 查找并返回已经加载过的名称为name的java.lang.Class实例 |
defineClass(String name,byte[]b,int off,int len) | 方法为final不能被重写,通过byte字节数组生成并返回名称为name的java.lang.Class实例 |
*注意
- 上面方法参数中的name指定的是类的二进制名,需要注意的是内部类的表示,com.maple.example$Test表示内部类Test
5、代理机制之双亲委派机制
解释:
某个类加载执行类加载请求时,先将该请求交给父类,父类再交给父类的父类,知道最高级父类,到达最高级父类时,他会判断我能不能加载这个类,如果能,则加载成功返回,如果不能,则交给他的一级子类重复以上的操作,知道这个类最后被成功加载
作用:
保证了Java核心库的类型安全,这种机制也是java很重要的安全屏障