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

posted @ 2013-11-26 21:10  剑握在手  阅读(405)  评论(0编辑  收藏  举报
返回顶部↑