Java内省

来源:互联网 发布:图像算法工程师无经验 编辑:程序博客网 时间:2024/05/12 22:16

一,为什么使用内省
开发框架时,经常使用到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());        }    }}
0 0
原创粉丝点击