关闭

Java 内省机制

294人阅读 评论(3) 收藏 举报
分类:

Java 内省机制    

      Java的内省机制其实就是基于java反射专门用于操作bean的属性的API。或者说内省是java语言对bean类属性,事件的一种缺省处理方法。

      JavaBean:是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进javaBean中,这种对象称为值对象,方法较少,信息通过类的私有变量的get,set方法获得。

      最常见的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器材(PropertyDescriptor,通过这个属性描述器来获取某个属性对应的get/set方法,然后我们就可以通过反射机制来调用这些方法。

      如上所说,我们单纯通过反射机制也可以实现自省的效果,应该说自省本质也是通过java反射来实现的。只不过封装了一层,专职专用而已。

      下面是一个把某个对象的所有属性名称和值都打印出来的例子:

packagedemo;  
 
importjava.beans.BeanInfo;  
importjava.beans.Introspector;  
importjava.beans.PropertyDescriptor;  
 
publicclassIntrospectorDemo{  
Stringname;  
publicstaticvoidmain(String[]args)throwsException{  
IntrospectorDemodemo=newIntrospectorDemo();  
demo.setName("WinterLau");  
 
//如果不想把父类的属性也列出来的话,  
//那getBeanInfo的第二个参数填写父类的信息  
BeanInfobi=Introspector.getBeanInfo(demo.getClass(),Object.class);  
PropertyDescriptor[]props=bi.getPropertyDescriptors();  
for(inti=0;i<props.length;i++){  
System.out.println(props[i].getName()+"="+  
props[i].getReadMethod().invoke(demo,null));  
}  
 
}  
 
publicStringgetName(){  
returnname;  
}  
 
publicvoidsetName(Stringname){  
this.name=name;  
}  
}  

      我们常用的struts,spring中都是应用java反射和内省机制来实现的。Spring Ioc 容器中类的属性注入就是先通过内省机制先获得set方法,然后通过反射机制来注入属性的。

      Struts中的FormBean也是通过内省机制来将表单中的数据映射到类的属性上。

      Java中的反射和内省可以帮助我们提高我们系统的灵活性和可扩展性,我们常见的那些灵活的框架很多都是反射+内省+xml+xml解析来实现的。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:68879次
    • 积分:2824
    • 等级:
    • 排名:第13064名
    • 原创:94篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1024条
    最新评论