概述
通过反射可以获取某类的 成员变量 信息,成员变量 对应的类是 Field类,成员变量 的信息封装在Field类对象中
获取 Field 类对象
通过Class类的以下方法:
- getDeclaredField(String name):根据 名字 获取 属性对象
- getDeclaredFields():获得所有 属性对象
- getField(String name):根据 名字 获取 public 的 属性对象
- getFields():获得所有 public 的属性对象
Field 类常用方法
- getName() 获得该成员变量的名称
- getType() 获取表示该成员变量的 Class 对象
- getDeclaringClass():返回定义该成员变量的 类 的 Class 对象
- get(Object obj) 获得指定对象 obj 中成员变量的值,返回值为 Object 类型
- set(Object obj, Object value) 将指定对象 obj 中成员变量的值设置为 value
- getlnt(0bject obj) 获得指定对象 obj 中成员类型为 int 的成员变量的值
- setlnt(0bject obj, int i) 将指定对象 obj 中成员变量的值设置为 i
- setFloat(Object obj, float f) 将指定对象 obj 中成员变量的值设置为 f
- getBoolean(Object obj) 获得指定对象 obj 中成员类型为 boolean 的成员变量的值
- setBoolean(Object obj, boolean b) 将指定对象 obj 中成员变量的值设置为 b
- getFloat(Object obj) 获得指定对象 obj 中成员类型为 float 的成员变量的值
- setAccessible(boolean flag) 此方法可以设置是否忽略权限直接访问 private 等私有权限的成员变量
- getModifiers() 获得可以解析出该方法所采用修饰符的整数
例子:
定义类
public class Student {
String name;
int age;
}
测试类
public class Test2 {
public static void main(String[] args) {
Student2 std=new Student2();
std.name="鹿晗";
std.age=19;
try {
// modifyFieldValue(std);
printFieldInfo(std);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
static void printFieldInfo(Object obj) throws IllegalAccessException {
System.out.println("成员变量信息:");
Field[] fields=obj.getClass().getDeclaredFields();
for(Field f:fields){
Class type=f.getType();
Object value=f.get(obj);
System.out.println(type.getSimpleName()+" "+f.getName()+"="+value);
}
}
// 修改成员变量信息
static void modifyFieldValue(Object obj) throws IllegalAccessException {
Field[] fields=obj.getClass().getDeclaredFields();
fields[0].set(obj,"吴亦凡");
fields[1].set(obj,25);
}
}
感谢:
https://www.jianshu.com/p/9be58ee20dee
https://www.cnblogs.com/qi-yi/p/18029192
