关于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”属性

 

posted on 2019-01-31 14:12  朱*力  阅读(701)  评论(0编辑  收藏  举报

导航