修改JavaBean的属性
在Java中,还可以使用内省修改JavaBean的属性。为了让读者更好地掌握如何使用内省修改JavaBean的属性,接下来通过一个案例来演示,如例1所示。
例1 IntrospectorDemo02.java
1 package cn.itcast.chapter08.introspector;
2 import java.beans.PropertyDescriptor;
3 import java.lang.reflect.Method;
4 import cn.itcast.chapter08.javabean.Person;
5 public class IntrospectorDemo02 {
6 public static void main(String[] args) throws Exception {
7 //创建Person类的对象
8 Person p = new Person();
9 //使用属性描述器获取Person类name属性的描述信息
10 PropertyDescriptor pd = new PropertyDescriptor("name",p.getClass());
11 //获取name属性对应的setter方法
12 Method methodName = pd.getWriteMethod();
13 //调用setter方法,并设置(修改)name属性值
14 methodName.invoke(p, "小明");
15 //String类型的数据,表示年龄
16 String val = "20";
17 //使用属性描述器获取Person类age属性的描述信息
18 pd = new PropertyDescriptor("age",p.getClass());
19 //获取age属性对应的setter方法
20 Method methodAge = pd.getWriteMethod();
21 //获取属性的Java数据类型
22 Class clazz = pd.getPropertyType();
23 //根据类型来判断需要为setter方法传入什么类型的实参
24 if(clazz.equals(int.class)){
25 //调用setter方法,并设置(修改)age属性值
26 methodAge.invoke(p, Integer.valueOf(val));
27 }else{
28 methodAge.invoke(p, val);
29 }
30 System.out.println(p);
31 }
32 }
运行结果如图1所示。
图1 运行结果
在例1中,第10行代码通过PropertyDescriptor描述器获取Person类中name属性的描述信息,第12行代码用于获取name属性的setter方法,第14行代码调用setter方法并传入实参,第22~29行代码用于获取age属性的数据类型,然后根据类型来判断为setter传入什么类型的实参。需要注意的是,使用内省设置属性的值时,必须要设置对应数据类型的数据,否则程序会出错。