类加载与反射

在这里插入图片描述

类加载与反射
1类加载
jvm运行机制:
1.源代码文件经编译器编译成字节码文件
2.字节码文件经类加载器加载到内存中
3.经过字节码校验器
4.经解释器解释
5.转化为机器语言
类加载:将.java文件编译过后的.class文件中的二进制代码加载到内存中去的过程
类加载器加载类的来源
1.本地文件系统加载的.class文件(我们自己写的),绝大多数的加载都是这里来的
从jar文件中加载.class,这种也是比较常见的
通过网络加载class文件
动态加载一个java源文件,先编译,后执行加载
类的生命周期:
1.加载
查找并加载类的二进制数据:
1.通过一个类的全限定名(文件的包名和类名)来获取其定义的二进制字节流
2.将字节流所代表的的静态存储结构转化为方法区的运行时数据结构(将所有的静态数据转换到方法区里面)作为程序运行时所需要的数据结构(方法区也是堆,方法区中放置的更多的是跟类相关的数据)
跟类相关的数据:类的代码、静态域/静态属性、静态初始化块、静态方法、常量池
3.在java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
2.连接
1.验证
验证是为了确保类的正确性(代码符合jvm运行要求)
验证内容如下:
(1).文件格式验证
(2).元数据验证
(3).字节码验证
(4).符号引用验证
2.准备
为类的静态变量分配内存,并设置默认初识值(基本数据类型为0,引用数据类型为null),使用static和final修饰的常量例外,在准备阶段就会将值赋进去
3.解析
将类的二进制数据中的符号引用全部替换为直接引用
3.初始化
为static修饰的静态变量赋初识值以及执行类里面的静态初始化块
以下情况,将会进行类的初始化
1.产生类的实例的时候
2.调用类的类变量的时候
3.调用类的静态方法的时候
4.反射,动态加载某一个类的时候
5.初始化一个类的子类的时候
以下情况不会进行初始化
1.使用final修饰的常量的调用
2.引用父类的静态变量
3.通过数组定义类引用
4.使用
即在程序代码中的使用
5.卸载
一般关闭虚拟机时才卸载,但遇到以下几中情况时也会卸载类:
1.程序正常运行完毕
2.运行System.exit(0)关闭虚拟机语句
3.程序运行时发生异常
类是有缓存的:使用标准的(javaSE版本的类加载器)加载器加载的类,在一定时间范围内是由缓存效果的,什么时候销毁由垃圾回收器决定
类加载器
类加载器有以下几种:
1.启动类加载器(引用类加载器):负责加载存放在JDK\jre\lib下的(java.*开头的)类
2.扩展类加载器:负责加载JDK\jre\lib\ext下的内容javax.*开头的的类
3.应用类加载器: 负责加载用户类路径所指定的类(我们自己写的类)
4.自定义类加载器:
需要注意的是不同的类加载器加载相同的类的时候,产生的类的class对象是不一样的
类加载机制
加载机制有以下三种:
1.全盘负责
由一个加载器负责所有jiazair
2.父类委托
先让父类加载器尝试加载该类,只有在父类的加载器无法加载时才尝试从自己的类路径中加载该类
3.代理加载
当一个加载器接受到一个类的加载请求时,让其他类加载器去帮助加载的过程,父类委托只是代理加载的一种
默认情况下,使用的是父类委托加载机制

2反射
反射机制
在java中可以在程序运行时期动态的加载、探知和使用,在编译期完全无法确定的类;换句话说:java可以在运行期去载入一个只知道“类的全限定名”的类,并且还可以获得其完整的数据结构(运行期数据),并且还可以参照这个完整的数据结构,我们拥有创建类的实例,以及访问类的属性,访问类的方法的能力,我们把这种能力,也称之为“自省”,“自审”,“内省”
反射的核心
class类
如何得到类对象
1.如果已知一个类的实例,可以直接使用:Class c = c.getClass();
2.如果编译器在编译期间已经知道类:Class c = 类名.class;
3.如果编译器在编译期不知道类名,但是在运行期可以获得:
Class c = Class.forName(str);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值