天天看点

java技术--内省机制

1.内省(IntroSpector):是Java语言对Bean类属性、事件的一种缺省(默认)处理方法

缺省:就是一个默认的初始值,在你不赋值的情况下会自动使用它

例如:定义一个boolean flag;此时没赋值,所以相当于写的Boolean flag=false; (缺省值是false)

(1)主要用于对JavaBean进行操作,JavaBean是一种特殊的Java类
     <1>这个Java类必须具有一个无参的构造函数
     <2>属性必须私有化
     <3>私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范(即:必须有get()、set()方法)
     <4>除了有私有化属性和对应的get(),set()方法,不能有其余数据的类就是JavaBean
(2)一般情况下,可以通过get(),set()来得到其值或者设置新的值
    <1>例如类A中有属性name
    <2>可以通过getName,setName来得到其值或者设置新的值
    <3>通过getName/setName来访问name属性,这就是默认的规则
(3)Java中提供了一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则,这些API存放于包java.beans中 
(4)通过反射的方式操作JavaBean的属性
    <1>通过类Introspector来获取某个对象的BeanInfo信息
    <2>然后通过BeanInfo来获取属性的描述器(PropertyDescriptor)
    <3>通过这个属性描述器就可以获取某个属性对应的getter/setter方法
(5)代码示例如下:
package com.bisien;
public class IntrospectorDemo{
public static void main(String[] args) throws Exception {
    //通过类Introspector来获取JavaBean的描述对象(了解其所有属性、公开的方法和事件)
    BeanInfo beanInfo = Introspector.getBeanInfo(Point.getClass(), Object.class);
     //通过反射实例化对象
     Point point = Point.class.newInstance();
    //通过BeanInfo来获取bean中的所有属性(只要有setXxx(),getXxx()方法中的一个,就是属性)
    PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
     for(PropertyDescriptor pd:pds){
     //获取当前属性的名称
     pd.getName();
     //获取当前属性的getter方法
     pd.getReadMethod();
      //获取当前属性的setter方法
      pd.getReadMethod();
        //得到要操作的属性
      if(pd.getName().equals("lon")){
        //得到属性的操作方法,即写方法
    Method writeMethod = pd.getWriteMethod();//获取set()
    writeMethod.invoke(point,135.6819);//给set()赋值:135.6819
    Method readMethod = pd.getReadMethod();//获取get()
    Object invoke = readMethod.invoke(point, null);//获取值
    System.out.println(invoke);
            }
        }
    }
//实体类Point
static class Point{
    private double lon;
    private double lat;
    private String loctime;
    Point(){}
    Point(double lon,double lat){
        this.lat = lat;
        this.lon = lon;
    }
    Point(double lon,double lat,String loctime){
        this.lat = lat;
        this.lon = lon;
        this.loctime = loctime;
    }
    public double getLon() {
        return lon;
    }
    public void setLon(double lon) {
        this.lon = lon;
    }
    public double getLat() {
        return lat;
    }
    public void setLat(double lat) {
        this.lat = lat;
    }
    public String getLoctime() {
        return loctime;
    }
    public void setLoctime(String loctime) {
        this.loctime = loctime;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Point point = (Point) o;
        return Double.compare(point.lon, lon) == 0 &&
                Double.compare(point.lat, lat) == 0 &&
                Objects.equals(loctime, point.loctime);
    }
    @Override
    public int hashCode() {
        return Objects.hash(lon, lat, loctime);
    }
    @Override
    public String toString() {
        return "Point{" +
                "lon=" + lon +
                ", lat=" + lat +
                ", loctime='" + loctime + '\'' +
                '}';
    }
    }
}
内省机制:就是不使用默认值获取属性名称并赋值操作