关于Java中内省的总结
内省基于JavaBean规范对反射进行了封装,提供了更加便捷的通过getter/setter方法来访问字段的方式
- Java内省的知识结构图
- JavaBean的规范
JavaBean在现在可以认为就是普通的Java类,JavaBean规范规定一组通用的规则,开发人员在声明类时,都应该遵守这些规则
1 类中要有一个无参public构造函数
2 类中字段要使用private修饰
3 为希望被外界访问的字段提供getter/setter方法,这些字段称为属性
4 getter方法命名时使用get+属性名称首字母大写形式,比如name属性的getter方法名为getName,setter方法命名方式相似,命名为setName
private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }
外界可以根据getter/setter方法名反推出属性名,在需要的时候可以让属性名和对应的字段名不一致,从而可以隐藏真正的字段名,具有一定的安全意义等
private String realName; //根据方法名getName反推出属性名为name,但对应的字段名是realName public String getName() { return realName; } public void setName(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”属性