Java笔记(23)反射

Java笔记(23)反射

1.类加载器

当我们写出一个java类的时候,这个扩展名为".java"的文件经过编译器编译成一个扩展名为".class"的文件,class文件中存储的是经过编译后的可由java虚拟机执行的虚拟机指令。当我们需要使用某个类时,虚拟机会经历下面几个步骤:

  1. 加载这个类的class文件,并在内存中创建这个class文件的Class对象
  2. 验证这个文件中的信息和数据是否符合虚拟机需求
  3. 为类成员初始化(static修饰的字段)这里不包含用final修饰的static,因为final在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
  4. 解析,主要将常量池中的符号引用替换为直接引用的过程。
  5. 初始化:类加载最后阶段,若该类具有超类(父类),则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值