动态语言
程序运行时可改变其结构,比如常见的 JavaScript,Python 等,从反射角度来说 Java 属于半动态语言。
概念
在运行状态中,对于任意一个类都能知道这个类所有的属性和方法,并且对于任意一个对象都可以调用它的任意一个方法。这种动态获取信息及动态调用对象方法的功能称为 Java 语言的反射机制。
应用场景
程序需要在运行时发现对象和类的信息,为了避免在编译时无法预知对象和类属于哪些类。
API
- Class 类:反射的核心类,可以获取类的属性,方法等信息。
- Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类中的属性值。
- Method 类:Java.lang.reflec 包中,表示类的方法,可以获取类中的方法信息或者执行方法。
- Constructor 类:Java.lang.reflec 包中,表示类的构造方法。
反射使用
- 获取想要操作的 Class 对象
- 调用某个对象的 getClass() 方法
- 调用某个类的 class 属性获取该类的 Class 对象
- 使用 Class 类中的 froName() 静态方法(常用)
- 调用 Class 类中的方法
- 使用反射 API 操作
创建对象
- 使用 Class 对象的 newInstance() 方法创建该 Class 对象的实例,要求Class 对象有默认的空构造方法
- 使用 Constructor 对象的 newInstance() 方法
// 获取 Person 的 Class 对象
Class clas = Class.forName("com.Person");
// 使用 .newInstance() 创建对象
Person p = (Person) clas.newInstance();
// 获取构造方法并创建对象
Constructor c = clas.getDeclaredConstructor(String.class, String.class, int.class);
// 创建对象并设置属性
Person p1= (Person) c.newInstance("张三", "男", 20);
反射常用方法
- getDeclaredConstructors:返回类的所有构造方法
- getModifiers:获取构造方法的类型
- getParameterTypes:获取构造方法的所有参数
- getDeclareConstructor(参数类型.class):获取指定参数类型的构造方法
- method.getDeclaredMethod(方法名,参数类型):获取指定方法
- 通过 method.invoke(类的实例,方法参数) 执行方法
- getDeclaredField(字段名):获取指定字段