通过反射访问属性
通过反射不仅可以创建对象,还可以访问属性。在反射机制中,属性的操作是通过Filed类实现的,它提供的set()和get()方法分别用于设置和获取属性。需要注意的是,如果访问的属性是私有的,则需要在使用set()或get()方法前,使用Field类中的setAccessible(true)方法将需要操作的属性设置成可以可被外界访问的。
为了帮助大家更好地理解如何通过反射访问属性,接下来,通过一个案例来演示,如例1所示。
例1 ReflectDemo03.java
1 package cn.itcast.chapter08.reflection;
2 import java.lang.reflect.Field;
3 class Person {
4 private String name; //定义属性name,表示姓名
5 private int age; //定义属性age,表示年龄
6 public String toString() { //重写toString()方法
7 return "姓名:"+this.name+",年龄:"+this.age;
8 }
9 }
10 public class ReflectDemo03 {
11 public static void main(String[] args) throws Exception{
12 //获取Person类对应的Class对象
13 Class clazz = Class.forName("cn.itcast.chapter08.reflection.Person");
14 //创建一个Person对象
15 Object p = clazz.newInstance();
16 //获取Person类中指定名称的属性
17 Field nameField = clazz.getDeclaredField("name");
18 //设置通过反射访问该属性时取消权限检查
19 nameField.setAccessible(true);
20 //调用set方法为p对象的指定属性赋值
21 nameField.set(p, "李四");
22 //获取Person类中指定名称的属性
23 Field ageField = clazz.getDeclaredField("age");
24 //设置通过反射访问该属性时取消权限检查
25 ageField.setAccessible(true);
26 //调用set方法为p对象的指定属性赋值
27 ageField.set(p, 20);
28 System.out.println(p);
29 }
30 }
运行结果如图1所示。
图1 运行结果
在例1中,第3~9行代码定义了一个Person类,类中定义了两个私有属性name和age。第10~30行代码定义了ReflectDemo03类,其中第19行代码用于取消访问属性时的权限检查,第20行代码用于调用set方法为对象的指定属性赋值。