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 + '\'' +
'}';
}
}
}
内省机制:就是不使用默认值获取属性名称并赋值操作