一,为什么使用内省
开发框架时,经常使用到java对象的属性来封装程序的数据,每次使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。
二,Java对象中的属性是由对象的get/set方法决定的
package cn.cyy.introspector;
public class Person {
private String name;
private int age;
private String password;
public String getAb(){
return null;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
此JavaBean有五个属性,分别为Ab、name、age、password、class。
get或者set方法算是一个属性,class是从父类继承过来的属性。
三,内省访问JavaBean属性有两种方式:
1,通过PropertyDescriptor类操作Bean的属性
2,通过Introspector类获取Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的get或者set方法,然后通过反射机制来调用这些方法。
package cn.cyy.introspector;
import java.beans.BeanDescriptor;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import org.junit.Test;
//使用内省API操作bean的属性
public class Demo1 {
//使用PropertyDescriptor,操纵bean的指定属性
@Test
public void test2() throws Exception{
Class clazz = Class.forName("cn.cyy.introspector.Person");//得到person类
Object obj = clazz.newInstance();//创建person类
PropertyDescriptor pd = new PropertyDescriptor("name", clazz);//创建name属性的属性描述器
Method method = pd.getWriteMethod();//为person的name属性赋值
method.invoke(obj, "cyy");
System.out.println(pd.getPropertyType());
System.out.println(pd.getReadMethod().invoke(obj, null));
}
//使用Introspector类操作Bean属性
@Test
public void test1() throws Exception{
Class clazz = Class.forName("cn.cyy.introspector.Person");
BeanInfo info = Introspector.getBeanInfo(clazz,Object.class);//得到bean自己的属性
BeanDescriptor bd = info.getBeanDescriptor();
bd.setValue("name", "cyy");
bd.setValue("age", 18);
System.out.println(bd.getValue("name")+":"+bd.getValue("age"));
PropertyDescriptor[] pds = info.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName());
}
}
}