self-confidence,the source of all the power

导航

java内省机制

一、概念

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

  JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。通俗地讲,每一对set/get方法都是对应的javaBean的一个属性, 内省就是对这些属性进行操作,与反射作用相仿。

二、API方法

PropertyDescriptor类:

  PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
      1. getPropertyType(),获得属性的Class对象;
      2. getReadMethod(),获得用于读取属性值的方法;getWriteMethod(),获得用于写入属性值的方法;
      3. hashCode(),获取对象的哈希值;
      4. setReadMethod(Method readMethod),设置用于读取属性值的方法;
      5. setWriteMethod(Method writeMethod),设置用于写入属性值的方法。

三、举个例子

先列一个bean出来

public class ClassInfo implements Serializable {
    private String             classId;
    private String             className;
    private TeacherBean        teacher;
public void setName(){
    }
    public String getClassId() {
        return classId;
    }

    public void setClassId(String classId) {
        this.classId = classId;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public TeacherBean getTeacher() {
        return teacher;
    }

    public void setTeacher(TeacherBean teacher) {
        this.teacher = teacher;
    }
}

我们先看看上面到底有多少个属性呢?根据定义,很明显的答案就是4个,但是其实他有5个属性,看下面

BeanInfo beanInfo = Introspector.getBeanInfo(ClassInfo.class);
        PropertyDescriptor[] pds = info.getPropertyDescriptors();
        for (PropertyDescriptor pd:pds){
            System.out.println(pd.getName());
        }

答案:
classId
className
teacher
name
class

为什么会多了一个class属性呢,原因很简单,每个java类都继承了Object类,而Object就有一个属性class。那可不可以不让父类的属性出现呢,答案是肯定的,而且只需在取Beaninfo的时候多加一个父类的参数就可以了

BeanInfo beanInfo = Introspector.getBeanInfo(ClassInfo.class,Object.class);

这个时候获取到的属性就全部是当前类的属性了。在得到PropertyDescriptor(属性描述符)后,接下来我们就可以对其属性进行修改和获取了。

ClassInfo c = new ClassInfo();
PropertyDescriptor pd = new PropertyDescriptor("classId",ClassInfo.class);
Method method = pd.getWriteMethod();   //相当于调用setClassid()方法
method.invoke(c,"233");   //

//获取属性的值
Method method = pd.getReadMethod();   //相当于调用getClassid()方法
method.invoke(c,null); //第二个参数表示为null表示无参   

 

posted on 2017-07-01 20:09  漩涡鸣人  阅读(257)  评论(0编辑  收藏  举报