现在的位置: 首页 > 综合 > 正文

java内省(Introspector)简介

2018年03月23日 ⁄ 综合 ⁄ 共 25562字 ⁄ 字号 评论关闭

内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:                                                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
/*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
 * Created on 2004-6-29                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
 */                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
package demo;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
import java.beans.BeanInfo;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
import java.beans.Introspector;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
import java.beans.PropertyDescriptor;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
/**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
  * 内省演示例子                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  *                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
  */                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
public class IntrospectorDemo {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
    String name;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    public static void main(String[] args) throws Exception{                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
        IntrospectorDemo demo = new IntrospectorDemo();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
        demo.setName( "Winter Lau" );                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
        // 如果不想把父类的属性也列出来的话,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        // 那 getBeanInfo 的第二个参数填写父类的信息                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        BeanInfo bi = Introspector.getBeanInfo(demo.getClass(), Object. class );                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
        PropertyDescriptor[] props = bi.getPropertyDescriptors();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
        for ( int i=0;i<props.length;i++){                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
            System.out.println(props[i].getName()+ "=" +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
                    props[i].getReadMethod().invoke(demo, null ));                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
        }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    public String getName() {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        return name;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    public void setName(String name) {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
        this .name = name;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
Web 开发框架 Struts 中的 FormBean 就是通过内省机制来将表单中的数据映射到类的属性上,因此要求 FormBean 的每个属性要有 getter/setter 方法。但也并不总是这样,什么意思呢?就是说对一个 Bean 类来讲,我可以没有属性,但是只要有 getter/setter 方法中的其中一个,那么 Java 的内省机制就会认为存在一个属性,比如类中有方法 setMobile ,那么就认为存在一个 mobile 的属性,这样可以方便我们把 Bean 类通过一个接口来定义而不用去关心具体实现,不用去关心 Bean 中数据的存储。比如我们可以把所有的 getter/setter 方法放到接口里定义,但是真正数据的存取则是在具体类中去实现,这样可提高系统的扩展性。

抱歉!评论已关闭.