Java笔记(23)反射
1.类加载器
当我们写出一个java类的时候,这个扩展名为".java"的文件经过编译器编译成一个扩展名为".class"的文件,class文件中存储的是经过编译后的可由java虚拟机执行的虚拟机指令。当我们需要使用某个类时,虚拟机会经历下面几个步骤:
- 加载这个类的class文件,并在内存中创建这个class文件的Class对象
- 验证这个文件中的信息和数据是否符合虚拟机需求
- 为类成员初始化(static修饰的字段)这里不包含用final修饰的static,因为final在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
- 解析,主要将常量池中的符号引用替换为直接引用的过程。
- 初始化:类加载最后阶段,若该类具有超类(父类),则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段进行赋值,成员变量也将在这个阶段被初始化为默认值)。
上面是类加载的几个步骤,而类加载器就是用来完成这几个步骤的,虚拟机提供了3种类加载器,来分别加载不同类型的类;
- (Bootstrap)根类加载器:主要加载的是JVM自身需要的类,这个类加载器使用C++语言实现的,是虚拟机自身的一部分,它负责将java安装路径文件lib下的核心类库或-Xbootclasspath参数指定的路径下的jar包加载到内存中,注意由于虚拟机是按照文件名识别加载jar包的,如rt.jar,如果文件名不被虚拟机识别,即使把jar包丢到lib目录下也是没有作用的(出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类)。
- 扩展(Extension)类加载器:扩展类加载器是指Sun公司(已被Oracle收购)实现的sun.misc.Launcher$ExtClassLoader类,由Java语言实现的,是Launcher的静态内部类,它负责加载<JAVA_HOME>/lib/ext目录下或者由系统变量-Djava.ext.dir指定位路径中的类库,开发者可以直接使用标准扩展类加载器。
- 系统(System)类加载器:也称应用程序加载器是指 Sun公司实现的sun.misc.Launcher$AppClassLoader。它负责加载系统类路径java -classpath或-D java.class.path 指定路径下的类库,也就是我们经常用到的clas