首页 > 代码库 > java内省机制

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());        }答案:classIdclassNameteachernameclass

为什么会多了一个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表示无参   

 

java内省机制