一、获取成员变量
通过Class类中的某些方法可以获取对应类中声明的成员变量的实例化对象
(1)Field[] getFields()
返回一个该Class对象表示类或接口中所有public属性(含继承的)对应的Field对象数组。
①源代码
import java.lang.reflect.Field;
class Father{
public int id;
public int number;
}
class Student extends Father{
public int id;
private String name;
public String address;
}
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = Student.class;
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field);
}
}
}
②执行结果
获取不到非public的成员变量
(2)Field getField(String fieldName)
返回该Class对象表示类或接口中与指定属性名(含继承的)相同的public 属性对应的Field对象。
①源代码
import java.lang.reflect.Field;
class Father{
public int id;
public int number;
}
class Student extends Father{
public int id;
private String name;
private String mobile;
public String address;
}
public class Test {
public static void main(String[] args) throws Exception {
Class clazz = Student.class;
Field field = clazz.getField("address");
System.out.println(field);
field = clazz.getField("number");
System.out.println(field);
field = clazz.getField("name");
System.out.println(field);
}
}
②执行结果
(3)Field[] getDeclaredFields()
返回一个该Class对象表示类或接口内定义的所有属性(不含继承的)对应的Field对象数组。
①源代码
把(1)中getFields方法实例中的getFields方法改为getDeclaredField
②执行结果
可以获取到非public的成员变量但是获取不到从父类中继承的成员变量
(4)Field getDeclaredField(String fieldName)
返回一个与该Class对象表示类或接口内定义的属性名(不含继承的)相匹配的属性相对应的Field对象。
①源代码
import java.lang.reflect.Field;
class Father{
public int id;
public int number;
}
class Student extends Father{
public int id;
private String name;
public String address;
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;
Field field = clazz.getDeclaredField("address");
System.out.println(field);
field = clazz.getDeclaredField("name");
System.out.println(field);
field = clazz.getDeclaredField("number");
System.out.println(field);
}
}
②执行结果
可以获取到非public的成员变量但是获取不到从父类中继承的成员变量
二、操纵成员变量–获取成员变量信息
通过Field类某些方法可以获取某个成员变量的信息,这些方法如下:
(1)Class<?> getDeclaringClass()
返回声明Field对象表示字段的类或接口所对应的Class对象。
(2)int getModifiers()
以整数形式返回Field对象表示的字段的修饰符。
(3)Class<?> getType()
返回Field对象所表示字段的数据类型所对应的Class对象(推荐)。
(4)Type getGenericType()
返回此Field对象所表示字段的声明类型。
(5)String getName()
返回Field对象表示字段的名称。
(6)取成员变量信息实例
①源代码
import java.lang.reflect.Field;
class Student{
public int id;
private String address;
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println("getDeclaringClass:"+field.getDeclaringClass());
System.out.println("getModifiers:"+field.getModifiers());
System.out.println("getType:"+field.getType());
System.out.println("getGenericType:"+field.getGenericType());
System.out.println("getName:"+field.getName());
}
}
}
②执行结果
三、操纵成员变量–获取及设置成员变量的值
通过Field某写方法可以获取和设置成员变量的值
(1)void setAccessible(boolean flag)
设置或获取属性值时是否忽略访问权限的影响,true表示忽略,false表示不忽略。
(2)Object get(Object obj)
返回Field表示字段的Object类型的值,obj为该属性所在类创建的对象,如果该属性是静态的,则可设置为null。
(3)void set(Object obj, Object value)
为Field对象表示属性设置新值。obj为该属性所在类创建的对象,如果该属性为静态的则课设置为null,value为该属性新值
①源代码
import java.lang.reflect.Field;
class Student{
private int id;
}
public class Test {
public static void main(String[] args) throws Exception {
Class<Student> clazz = Student.class;//创建Class类实例化对象
Student student = clazz.newInstance();//创建学生对象
Field field = clazz.getDeclaredField("id");//获取成员变量
field.setAccessible(true);//取消属性的访问权限控制
field.set(student, 1111);
Object id = field.get(student);
System.out.println(id);
}
}
②执行结果:1111
三、操纵成员变量实战
利用反射的方法为date赋值,并使其能正常调用login方法
import java.text.SimpleDateFormat;
import java.util.Date;
public class Student {
private Date date;
public void login() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println("系统登陆成功,登陆时间为:"+sdf.format(this.date));
}
}
实现
import java.lang.reflect.Field;
import java.util.Date;
public class Test{
public static void main(String[] args) {
Class<Student> clazz = Student.class;//创建Class类实例化对象
try {
Student student = clazz.newInstance();
Field field = clazz.getDeclaredField("date");
field.setAccessible(true);
field.set(student, new Date());
student.login();
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果