Java反射获取字段、设置字段以及获取字段的值
获取字段
1.先找到字段所在类的字节码
2.找到需要被获取的字段
Class类中获取字段:
public Field[] getFields();//获取包括自身和继承(实现)过来的所有的public字段——Field不支持泛型<>,即后面不接<>
public Field[] getDeclaredFields();//获取自身所有的字段(private、public、protected,和访问权限无关),不包括继承的
public Field[] getField(String fieldlName);//表示获取指定的一个公共的字段,包括继承的
public Field[] getDeclaredField(String fieldlName);//表示获取本类中的一个指定的字段(private、protected、public,与访问权限无关),不包括继承的字段
要想获取父类中的私有字段,需要先获取父类的字节码,在获取父类的字段
Class clz=User.class;
Class sc=clz.SuperClass;
给某个类中的字段设置值和获取值
1.找到被操作的字段所在的类的字节码
2.获取该被操作的字段对象
3.设置值/获取值
Eg:
class User{
private String name;
private int age;
}
Class<User> clz=User.class;
Field age=clz.getDeclaredField(“age”);
设置值之前,需要设置可访问权限
Field类中:
public Void setXXX(Object obj, XXX value);//为基本类型字段设置值,XXX表示基本数据类型
public Void set(Object obj, Object value);//为引用类型字段设置值
参数:
obj: 表示字段底层所属对象(字段为实例变量,则属于一个实例对象);若该字段是static的,该值可以设置为null,或者任意一个该类的对象
value:表示将于为字段设置的值
age.setAccessible(true);
Object obj=clz.newInstance();
age.setInt(obj, 17);
获取字段的值
获取值之前,需要设置可访问权限
Field类中:
public XXX getXXX(Object obj);//获取基本类型字段的值,XXX表示基本数据类型
public Object get(Object obj);//获取引用类型字段设置值
参数:
obj: 表示字段底层所属对象(字段为实例变量,则属于一个实例对象);若该字段是static的,该值可以设置为null,或者任意一个该类的对象
返回:该字段的值
Class<User> clz=User.class;
Field ageField=clz.getDeclaredField(“age”);
ageField.setAccessible(true);
Object obj=clz.newInstance();
ageField.setInt(obj, 17);
int ageValue=ageField.getInt(obj);
Field nameField=clz.getDeclaredField(“name”);
nameField.setAccessible(true);
Object nameObj=nameField.get(obj);