类加载器ClassLoader

类加载器就是寻找类的字节码文件并构造出类在JVM内部表示对象的组件。

类加载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件。

JVM在运行时会产生三个ClassLoader:根类加载器,ExtClassLoader和AppClassLoader。

根类加载器不是ClassLoader的子类,它是用C++编写,因此我们在Java中看不到它。根类加载器负责加载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。

ExtClassLoader负责加载JRE扩展目录ext中的jar包。

AppClassLoader负责ClassPath路径下的类包。

这三个加载器之间存在父子层级关系,即根类加载器是ExtClassLoader的父加载器,ExtClassLoader是AppClassLoader的父加载器。

JVM加载类时使用“全盘负责委托机制”。

ClassLoader是一个抽象类,位于java.lang包中:

1. Class loadClass(String name):

2. Class defineClass(String name, byte[] b, int off, int len):

3. Class findSystemClass(String name):

4. Class findLoadedClass(String name):

5. ClassLoader getParent():

类文件被加载并解析后,在JVM内将拥有一个对应的java.lang.Class类描述对象,该类的实例都拥有指向这个类描述对象的引用,而类描述对象又拥有指向关联ClassLoader的引用。

每一个类在JVM中都拥有一个对应的java.lang.Class对象,它提供了类结构信息的描述。数组、枚举、注解以及基本Java类型甚至void都拥有对应的Class对象。

Class对象是在加载类时由JVM通过调用类加载器中的defineClass()方法自动构造的。

 

原文地址:https://www.cnblogs.com/i-hard-working/p/10393305.html