版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38750084/article/details/83962997
在Java反射中Field用于获取某个类的属性或该属性的属性值
一:如何通过Field反射获取类的属性
Field提供如下几种方法:
1:Class.getDeclaredField(String name); 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段(包括私有成员)。 2:Class.getDeclaredFields(); 返回 Field 对象的一个数组,该数组包含此 Class 对象所表示的类或接口所声明的所有字段(包括私有成员)。 3:Class.getField(String name); 返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 4:Class.getFields(); 返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段。 |
下面一个例子说明如何通过Field反射获取类中的属性
我们先定义一个普通类Person
包含三个属性 公有name 私有age、sex
package testReflect;
public class Person {
public String name;
private Integer age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex
+ "]";
}
}
Test类 测试
package testReflect;
import java.lang.reflect.Field;
/**
* 通过Field反射的各方法访问属性
* @author 5_6-TANGZHANBO
*
*/
public class Test
{
public static void main(String[]args) throws NoSuchFieldException, SecurityException
{
Person p = new Person();
p.setAge(30);
//通过Class.getDeclaredField(String name)获取类或接口的指定的已声明字段。
Field f1 = p.getClass().getDeclaredField("name");
System.out.println("f1==="+f1);
//通过Class.getDeclaredFields()获取类或接口的指定已声明字段。
Field[] f2 = p.getClass().getDeclaredFields();
for (Field field : f2) {
System.out.println("f2--field "+field);
}
//Class.getField(String name)用法
//通过Class.getField(String name)返回一个类或接口的指定的公共成员字段,私有成员报错。
Field f3_0 = p.getClass().getField("name");
System.out.println("f3_0==="+f3_0);
//如果获取age属性(私有成员) 则会报错 ,age是private
//Field f3_1 = p.getClass().getField("age");//Exception in thread "main" java.lang.NoSuchFieldException: age
//System.out.println("f3_1==="+f3_1);
//Class.getFields()用法
//通过Class.getFields(),返回 Class 对象所表示的类或接口的所有可访问公共字段。
Field f4 [] = p.getClass().getFields();
for (Field field : f4) {
//因为只有name属性为共有,因此只能遍历出name属性
System.out.println("f4--field "+field);
}
}
}
测试结果: