类加载器

来源:互联网 发布:行知实验小学怎么样 编辑:程序博客网 时间:2024/06/09 22:08

类加载器

1. 概念:将类加载过程中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到java虚拟机外部去实现,让应程序自己决定如何获取所需要的类,这个动作的实现称作是类加载器。

2. 作用:只用来实现类的加载动作,但是在java中不仅仅是这样。对于任意两个类,当两个类的类加载器不同的时候两个类 必然不相同。Equels(),intanceof()

双亲委派模型


3.虚拟机角度两种

启动类加载器

使用C++实现,是虚拟机的一部分

所有其他的类加载器

Java语言实现

4.开发者角度三种

(1)启动类加载器

负责将 Java_Home/lib下面的类库加载到内存中(比如rt.jar)。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

它无法被java程序直接引用,用户在编写自定义类加载器的时候,需要把加载请求委派给引导类加载器,那直接使用null代替既可。

(2)扩展类加载器

     ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将Java_Home /lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器

(3)应用程序类加载器

是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。由于这个类加载器是ClassLoader中的getSystemClassLoader()方法的返回值,因此一般称为系统(System)加载器

1、类加载器的双亲委派模型

 

通过组合的方式而不是通过继承,除了启动类加载器其他类均有父类加载器

工作过程:

类加载器收到了类加载的请求,就会直接委派给父亲类加载器去完成,每一个层次的加载器都是如此,因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。父类加载器反馈自己无法加载这个请求时,子类才会尝试自己加载。

保证了java程序的稳定运作,Java类随着它的类加载器一起具备了一种带有优先级的层次关系

2、破坏双亲委派模型

线程上下文类加载器,逆向使用双亲委派模型,所有涉及到SPI的加载动作基本上都是采用这个方式eg:JBDC;