反射
反射:动态语言
核心:Reflection
反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法
简单理解:
是什么:
正常流程是 对象.属性获取属性值, 反射:属性.对象获取属性值
那么类可能就不是一个必须的东西了,可以通过属性反向编写出类
有什么用:
-
根据类名创建实例(类名可以从配置文件读取,不用new,达到解耦)
-
用Method.invoke执行方法
-
Java反射机制提供的功能
-
在运行时判断任意一个对象所属的类
-
在运行时构造任意一个类的对象
-
在运行时判断任意一个类所具有的成员变量和方法
-
在运行时调用任意一个对象的成员变量和方法
-
生成动态代理例如:spring中的控制反转
-
-
反射相关的主要API:
-
java.lang.Class:代表一个类
-
java.lang.reflect.Method:代表类的方法
-
java.lang.reflect.Field:代表类的成员变量
-
java.lang.reflect.Constructor:代表类的构造方法
-
反射的简单应用
Teacher类
class Teacher extends ArrayList implements Runnable, Serializable, Comparable {
private String name;
private int age;
private String gender;
public Teacher() {}
public Teacher(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
public String getGender() {return gender;}
public void setGender(String gender) {this.gender = gender;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
软硬编码,与反射的基本应用
**问题**:getField() 方法获取到的是类中公共属性(**public**), 还可以获取到**从父类继承的公共属性.**
解决:AccessibleObject类的setAccessible():将accessible标志设置为传递的布尔值(PS:所属性设置为可访问的. 暴力反射)
getDeclaredField() 方法获取到本类中声明的所有属性, 包括私有属性.