java内省

1、什么是内省?

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

  JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。将这些信息储存在类的私有变量中,通过set()、get()获得。如:

  public class Person {
    private String name;
    private int age;
    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;
    }
  }

  在Person类中有属性name,那我们可以通过getName(),setName()来得到其值或设置新的值。通过getName(),setName()来访问name属性,这就是默认的规则。Java JDK中提供了一套API用来访问某个属性的getter/setter方法,这就是内省。

  JDK内省类库:

    PropertyDescriptor类:该类表示JavaBean类通过存储器导出一个属性。主要方法:(1)getName()获取属性名,(2)getPropertyType()获取属性的Class对象,(3)getReadMethod()获得用于读取属性值的方法;getWriteMethod()获得用于写入属性值的方法。

    Introspector类: 将JavaBean中的属性封装起来进行操作。在程序中把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo(class)方法,得到的BeanInfo对象封装了把这个类当做JavaBean来看的结果信息,即属性的信息。getPropertyDescriptors(),获得属性的描述,放在PropertyDescriptor[]数组中,来查找、设置类的属性。

2、内省怎么用?

  1)操作一个属性

    如只操作Person类中的age属性:

    PropertyDescriptor pro = new PropertyDescriptor("age", Person.class);
    Person person = new Person();
    Method method = pro.getWriteMethod();
    method.invoke(person, 12);
    System.out.println(pro.getReadMethod().invoke(person));

  2)操作多个属性

    PropertyDescriptor[] pro = Introspector.getBeanInfo(Person.class).getPropertyDescriptors();

    Person p = new Person();

    System.out.print("Person的属性有:");

    for (PropertyDescriptor pr : pro) {

      System.out.print(pr.getName() + " ");

    } 

    System.out.println("");
    for (PropertyDescriptor pr : pro) {
      // 获取bean的set方法
      Method writeme = pr.getWriteMethod();
      if (pr.getName().equals("name")) {
      // 执行方法
        writeme.invoke(p, "xiong");
      }
      if (pr.getName().equals("age")) {
        writeme.invoke(p, 23);
      }
      // 获取bean的get方法
      Method method = pr.getReadMethod();
      System.out.print(method.invoke(p) + " ");
    }

    或

    Class<?> cl = Class.forName("com.ushareit.springMaven.Person");

    BeanInfo beaninfo = Introspector.getBeanInfo(cl, Object.class);

    PropertyDescriptor[] pro = beaninfo.getPropertyDescriptors();

    Person p = new Person();

    System.out.print("Person的属性有:");

    for (PropertyDescriptor pr : pro) {

      System.out.print(pr.getName() + " ");

    }

    System.out.println("");
    for (PropertyDescriptor pr : pro) {
      // 获取bean的set方法 
      Method writeme = pr.getWriteMethod();
      if (pr.getName().equals("name")) {
      // 执行方法 
        writeme.invoke(p, "xiong");
      } 
      if (pr.getName().equals("age")) {
        writeme.invoke(p, 23);
      }
      // 获取bean的get方法 
      Method method = pr.getReadMethod();
      System.out.print(method.invoke(p) + " ");
    }

posted @ 2015-11-18 17:30  达摩克利斯之剑  阅读(192)  评论(0编辑  收藏  举报