内省基于JavaBean规范对反射进行了封装,提供了更加便捷的通过getter/setter方法来访问字段的方式
Java内省的知识结构图
JavaBean的规范
JavaBean在现在可以认为就是普通的Java类,JavaBean规范规定一组通用的规则,开发人员在声明类时,都应该遵守这些规则
1 类中要有一个无参public构造函数
2 类中字段要使用private修饰
3 为希望被外界访问的字段提供getter/setter方法,这些字段称为属性
4 getter方法命名时使用get+属性名称首字母大写形式,比如name属性的getter方法名为getName,setter方法命名方式相似,命名为setName
privateString name;publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}
外界可以根据getter/setter方法名反推出属性名,在需要的时候可以让属性名和对应的字段名不一致,从而可以隐藏真正的字段名,具有一定的安全意义等
privateString realName;//根据方法名getName反推出属性名为name,但对应的字段名是realName
publicString getName() {returnrealName;
}public voidsetName(String name) {this.realName =name;
}
如无特殊需求,应该让字段名和属性名保持一致
另外,对于boolean基本类型的字段,比如boolean isMarried,其getter方法也可以是isMarried(),其setter方法也可以是setMarried(value),eclipse等工具默认生成的就是这两个方法,
不过这两个方法名在有些技术框架中是无效的,会导致程序出错,所以最好使用getIsMarried()和setIsMarried(value),而且建议在项目中使用Boolean类型的字段
一些特殊的字段名,比如uName这种第二个字母是大写的情况,其getter方法名应该为getuName();再比如URL这种全部大写的情况,其getter方法应该为getURL()。其实大家应该避免让自己声明的字段名成为上面两种情况
Java的内省API
Introspector是内省编程的入口,可以把Class对象解析成BeanInfo对象
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
BeanInfo表示一个符合JavaBean规范的类的信息,可以方便的获得类中的属性
PropertyDescriptor表示类中的属性,其实包含了属性名,getter和setter方法
BeanInfo beanInfo =Introspector.getBeanInfo(beanClass);
PropertyDescriptor[] propDescriptors=beanInfo.getPropertyDescriptors();for(PropertyDescriptor propDescriptor : propDescriptors) {
String propName=propDescriptor.getName();if (!"class".equals(propName)) {
Method getter=propDescriptor.getReadMethod();
Method setter=propDescriptor.getWriteMethod();
}
}
Object声明了getClass()方法来获得对象本身类型的Class对象,由于所有的类都继承自Object,所以所有的类都有getClass()方法。但类中并没有class字段(class是关键字,不可以作为类名),而且也没有setClass()方法,
所以在使用内省编程的时候一般需要过滤掉“class”属性