Java web-内省(Introspector)

来源:互联网 发布:佳能9100cdn网络驱动 编辑:程序博客网 时间:2024/05/29 00:34

这个反射类是在网易云课堂上30天轻松掌握JavaWeb里面学习的。可以写框架用。但是为什么还要学呢?当然是为了用喽。
内省是sun公司开发的一套API,专门用于操作java对象的属性,虽然反射技术也可以,但是反射技术过于麻烦。

  • 内省访问JavaBean属性的两种方式:
    1:通过PrepertyDescriptor类操作Bean的属性
    2:通过Introspector类获得Bean对象的BeanInfo,然后通过BeanInfo来获取属性描述器(PropertyDescriptor),通过这个属性描述器就可以获得某个属性相应的getter/setter方法,在通过反射机制来调用这些方法
  • 什么是JavaBean
package com.test.introspector;public class Person { //JavaBean    private String name;    private String password;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }     public int getAB() {        return ab;    }    public void setAB(int age) {        this.ab = ab;    }}

如上面的Person类便是一个JavaBean,在java web中,用户会提交许多数据,比如账户名,密码等,而我们要创建一个对象去接收用户的数据,创建的这个对象就是一个javaBean.
javabean的属性取决于javabean中的getter/setter方法,而不是其定义的变量。
如上面代码,其中并没有定义ab变量,但是有getAB和setAB方法,则我们说这个javaBean中有ab属性。
注意:上面的Person类一共有5个属性(name, password, age, ab, class),class属性是继承其父类Object中的属性。也就是我们创建的每一个javaBean中都会有一个class属性。

  • 写内省类的一般步骤:
    用Introspector类中的getBeanInfo得到BeanInfo对象 -> 利用BeanInfo对象中的的getPropertDesriptors()得到PropertDescriptors(属性描述器)对象 ->
    利用PropertDescriptor对象中的setReadMethod、setWriteMethod(JavaBean中的getter/setter方法)对JavaBean中的属性进行操作。
package com.test.introspector;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 Dome1 {    @Test    public void test1() throws Exception {        BeanInfo info = Introspector.getBeanInfo(Person.class); //得到bean的所有属性,包括继承属性//        BeanInfo info = Introspector.getBeanInfo(Person.class, Object.class);//得到bean自己的属性,不包括继承Object继承的属性        PropertyDescriptor[] pds = info.getPropertyDescriptors(); //创建PropertyDescriptor数组        for (PropertyDescriptor pd : pds) {            System.out.println(pd.getName());  //输出JavaBean所有的属性。        }    }    //操纵bean的指定属性:age    @Test    public void test2() throws Exception {        Person p = new Person(); //只是为了省事,应该用reflect出Preson对象        PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);         //得到属性的写方法,为属性赋值        Method method = pd.getWriteMethod(); //等同public void setAge(int age)        method.invoke(p, 666);        //获取属性的值//        System.out.println(p.getAge()); //一般方法        method = pd.getReadMethod();        System.out.println(method.invoke(p)); //age的get方法无参数,所以只传一个Person对象    }    //获取当前操作属性的类型    @Test    public void test3() throws Exception {        PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);         System.out.println(pd.getPropertyType()); //getPropertyType返回的是class类型    }}
原创粉丝点击