java 内省(Introspector)
开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。
当然你也可以用反射来操作JavaBean的属性,但是,内省专门用来操作JavaBean的属性。这样看来是不是内省更专业些?它的API位置:java.beans.Introspector。
什么是JavaBean?
就是一个用来封装用户提交过来的数据的类,说白了就是一个描述用户数据的类。再说白点,就是一个类……
什么是属性?
注意字段(成员变量)和属性所指不同。一般来说,如果你和我一样不是高手,我们可以这样简单的来识别:一个类中拥有get或者set方法,那么它的属性就是get或者set方法的方法名中,“get”或者“set”后边的部分。任何类都至少有一个属性,因为所有类都继承Object类,而Object类中有一个getClass()方法……
代码示例:
BeanInfo info = Introspector.getBeanInfo(Person.class); //我们也可以从配置文件中获取某个class,参看反射相关内容。
这就是将Person这个类文件的所有信息封装成一个类放在info中便于操作。BeanInfo是javaAPI中一个接口,这里getBeanInfo:
getBeanInfo
public static BeanInfo getBeanInfo(Class<?> beanClass, int flags) throws IntrospectionException
- 在 Java Bean 上进行内省,了解其所有属性、公开的方法和事件,并将结果用一些控制标记表示。
如果 Java Bean 的 BeanInfo 类以前已经基于相同的参数被内省,则从 BeanInfo 缓存中检索 BeanInfo 类。
PropertyDescriptor[] pds = info.getPropertyDescriptors();//属性描述器,得到类的所有属性
for(PropertyDescriptor pd : pds){
System.out.println(pd.getName());//可以打印其属性看看
//如果不需要这个类从父类继承过来的属性可以用“BeanInfo info = Introspector.getBeanInfo(Person.class,父类);”来初始化。
}
如果只想操作一个类的某一个属性比如(Person类的age属性)可以这样写:
PropertyDescriptor pd = new PropertyDescriptor("age",Person.class);
Method method = pd.getWriteMethod(); //得到属性的写方法,这里就是拿到setAge方法
method.invoke(指定Person对象,...method方法的参数);
method = pd.getReadMethod();//获取读方法
System.out.println(method.invoke(指定Person对象,...method方法的参数,没有就写null));
获取属性的类型
pd.getPropertyType();
更多内容请参阅API