使用Class对象可以获取类定义的所有成员变量,获取的成员变量以Field类型的对象或数组方式返回,每个Field对象代表一个成员变量,利用Field对象提供的方法可以操作该类的成员变量。
Class类定义了如下方法,用于访问类的成员变量。
● Field[] getFields()
该方法返回一个包含类成员变量对象的数组,该数组包含该类对象表示的类或接口的所有可访问的公共成员变量。
● Field getField(String name)
该方法返回一个类成员变量对象,该成员变量对象必须是公共成员。name参数是一个字符串,指定所需成员变量的名称。
● Field[] getDeclaredFields()
该方法返回一个类成员变量对象数组,该数组包括该类的所有成员变量。这包括公共、受保护、默认(包)访问和私有成员变量,但不包括继承的成员变量。
● Field getDeclaredField(String name)
该方法返回一个类成员变量对象。name参数是一个字符串,指定所需字段的简单名称。
案例1:建立FieldTest1测试类,应用Class类的getFields()方法获取Person类的成员变量。
在PCoreUnit8项目新建field包,在field包下新建FieldTest1类。代码如下:
package field;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import constructor.Person;
/**
* @ClassName: FieldTest1
* @Description: 反射(访问类的成员变量)案例1
* @author 编程训练营
* @date
*
*/
public class FieldTest1 {
/**
* @Title: main
* @Description:Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 获取Person类的Class对象
Class<?> personClass = (Class)Person.class;
try {
//通过class.getFields()获取所有具有public权限的成员变量
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println("通过class.getFields()获取所有具有public权限的成员变量:" + field);
}
//通过class.getField(name)获取指定名称的成员变量
//成员变量必须是public访问权限
Field field1 = personClass.getField("job");
System.out.println("通过class.getField(name)获取指定名称的成员变量" + field1);
//通过class.getDeclaredFields获取所有的成员变量
Field[] fields1 = personClass.getDeclaredFields();
for (Field dfield : fields1) {
System.out.println("通过class.getDeclaredFields获取所有的成员变量:" + dfield);
}
//通过class.getDeclaredField(name)获取指定名称的成员变量
Field field2 = personClass.getDeclaredField("name");
System.out.println("通过class.getDeclaredField(name)获取指定名称的成员变量" + field2);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}FieldTest1程序应用Person类的静态成员变量class获取Class对象,分别调用Class类的getFields()、getField()、getDeclaredFields()、getDeclaredField()方法获取Person类的成员变量。
getField()方法和getDeclaredField()方法的区别是:getField()方法用于获取类或接口的所有可访问的公共成员变量;getDeclaredField()方法可以获取包括公共、受保护、默认(包)访问和私有成员变量,但不包括继承的成员变量。
程序执行结果如下图所示:
