Java内省和反射浅谈

一、什么是内省?

  内省(Introspector)是Java语言对JavaBean类属性、事件的处理方法

  例如类User中有属性name,那么必定有getName,setName方法,我们可以通过他们来获取或者设置值,这是常规操作。

  Java提供了一套API来访问某个属性的getter/setter方法,这些API存放在java.beans中

二、什么是反射?

  Java反射机制是在运行中,对任意一个类,能够获取得到这个类的所有属性和方法;

  对于任意一个对象,都能够调用它的任意一个方法;

  这种动态获取类信息以及动态调用类对象方法的功能叫做Java语言的反射机制

三、示例解析

  存在类User: 

public class User {
    private String name;
    private int age;
    private Date birthday;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        System.out.println("[User:setName "+name+"]");
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", birthday=" + birthday
                + "]";
    }
}
View Code

  通过反射机制操作name属性:

        User user = new User();
        Field f = user.getClass().getDeclaredField("name");
        f.setAccessible(true);
        f.set(user, "mld");//设置属性值
        String name = (String)f.get(user);//获取属性值
View Code

  通过内省操作name属性:

User user = new User();
        //操作单个属性
        PropertyDescriptor pd = new PropertyDescriptor("name", User.class);
        Method w = pd.getWriteMethod();//获取属性的setter方法
        w.invoke(user, "winclpt");
        Method r = pd.getReadMethod();//获取属性的getter方法
        r.invoke(user, null);
        
        //操作所有属性
        BeanInfo bi = Introspector.getBeanInfo(User.class);
        PropertyDescriptor[] pds = bi.getPropertyDescriptors();
        for(PropertyDescriptor p : pds){
            
        }
View Code

四、区别

  反射可以操作各种类的属性,而内省只是通过反射来操作JavaBean的属性

  内省设置属性值肯定会调用seter方法,反射可以不用

PS:有毛用???我直接用反射不好了,谁给我解释下

posted @ 2017-08-21 16:43  暗夜心慌方  阅读(7702)  评论(1编辑  收藏  举报