Java内省

 内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。我可以通过getter/setter访问,设置类中的属性。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,,这些 API 存放于包 java.beans 中。

 一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。

package com.tc.test;


import java.beans.BeanInfo;

import java.beans.IntrospectionException;

import java.beans.PropertyDescriptor;


public class Introspector {

    private String name;

    private Integer age;


    public String getName() {

       return name;

    }


    public void setName(String name) {

       this.name = name;

    }


    public Integer getAge() {

       return age;

    }


    public void setAge(Integer age) {

       this.age = age;

    }


    public Introspector(String name, Integer age) {

       this.name = name;

       this.age = age;

    }


    public static void main(String[] args) {

       Object object = new Introspector("hjz", 180);

       try {

           // getBeanInfo方法有三个重载,用法见API

           BeanInfo beanInfo =  java.beans.Introspector.getBeanInfo(object.getClass(), Object.class);

           

           // 遍历属性

           PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();

           for (PropertyDescriptor propertyDescriptor : descriptors) {

              System.out.println(propertyDescriptor.getName());

           }

           

           // 读写属性

           for (PropertyDescriptor propertyDescriptor : descriptors) {

              try {

                  System.out.println(propertyDescriptor.getReadMethod().invoke(object, null));

                  System.out.println(propertyDescriptor.getWriteMethod().getName());

              } catch (Exception e) {

                  e.printStackTrace();

              }

           }

       } catch (IntrospectionException e) {

           e.printStackTrace();

       }

    }

}

对一个 Bean 类来讲,可以没有属性,但是只要有 getter/setter 方法中的其中一个,那么 Java 的内省机制就会认为存在一个属性,比如类中有方法 setMobile ,那么就认为存在一个 mobile 的属性,这样可以方便我们把 Bean 类通过一个接口来定义而不用去关心具体实现,不用去关心 Bean 中数据的存储。比如我们可以把所有的 getter/setter 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。

你可能感兴趣的:(java,bean,mobile,D语言)