反射
允许程序在运行时来进行自我检查并且对内部的成员进行操作
反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关语义
反射机制的作用
- 在运行时判断任意一个对象所属的类
- 在运行时获取类的对象
- 在运行时访问java对象的属性,方法,构造方法等
java.lang.reflect类库里主要的类
- Field:表示类中的成员变量
- Method:表示类中的方法
- Constructor:表示类中的构造方法
- Array:该类提供了动态创建数组和访问数组元素的静态方法
反射依赖的Class
用来表示运行时类型信息的对应类
- 每个类都有唯一一个与之相对应的Class对象
- Class类作为类类型,而Class为类类型对象
Class类的特点
- Class类也是类的一种,class则是一种关键字
- Class类只有一个私有的构造函数,只有JVM能够创建Class类的实例
- JVM中只有唯一一个和类相对应的Class对象来描述其类型信息
获取Class对象的三种方式
- Object ——> getClass()
- 任何数据类型(包括基本数据类型)都一个‘静态’的class属性
- 通过Class类的静态方法:forName(String className)(常用)
代码展示
public static void main(String[] args) throws ClassNotFoundException {
ReflectTarget reflectTarget = new ReflectTarget();
//第一种方式获取Class对象
Class reflectTargetClass1 = reflectTarget.getClass();
System.out.println("first:"+reflectTargetClass1.getName());
//第二种方式获取对象
Class reflectTargetClass2 = ReflectTarget.class;
System.out.println("second:"+reflectTargetClass2.getName());
//第三种方式获取对象
Class reflectTargetClass3 = Class.forName("com.geek.demo.reflect.ReflectTarget");
System.out.println("third:"+reflectTargetClass3.getName());
//判断三种方式获取的对象是不是同一个
System.out.println(reflectTargetClass1 == reflectTargetClass2);
System.out.println(reflectTargetClass1 == reflectTargetClass3);
System.out.println(reflectTargetClass2 == reflectTargetClass3);
}
运行结果
first:com.geek.demo.reflect.ReflectTarget
second:com.geek.demo.reflect.ReflectTarget
third:com.geek.demo.reflect.ReflectTarget
true
true
true
在运行期间,一个类,只有一个与之相对应的Class对象产生