Java反射(一)
一.什么是反射
Reflection指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。
加载完类后,在内存的方法区中产生了一个Class类型的对象(只有一个),这个对象包含了完整的类结构信息,通过这个对象可以看到类的信息。
Class c = Class.forName("com.se.reflection.Stu");
- 一般:引入类名称,new实例化,获得实例化对象
- 反射:实例化对象,getClass()获得相应类名称
二.Class类
Class类是Reflection的根源
每个Class对象对应一个class文件
通过Class可以获得一个类的结构
Class对象由系统建立
获取Class类示例方法:
- 已知具体类,通过class属性获取
Class cl = Stu.class; - 已知类的一个实例对象,调用getClass()获取Class对象
Class cl = stu.getClass(); - 已知类的类全名称,并且该类在类路径下,通过forName()获取
Class cl = Class.forName("com.se.Stu"); - 内置数据类型,直接类名.TYPE
Class cl = Integer.TYPE;
拥有Class对象的类型:class,[],interface,enum,annotation,void,基本数据类型
三.类加载与类初始化


类初始化:
类主动引用(发生类初始化):
- 虚拟机启动时先初始化main方法所在类
- new一个类对象
- 调用类的静态成员和方法
- 对类反射调用
- 初始化类时,会先初始化其没有被初始化的父类
被动调用(不初始化):
- 通过数组定义类引用
- 引用常量
- 访问静态域时,只有真正声明这个域的类才会被初始化

浙公网安备 33010602011771号