`
xiangxingchina
  • 浏览: 520363 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA的内省机制(introspector)与反射机制(reflection)

阅读更多

相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术,这种技术比内省机制使用范围更广泛。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属 性的值。 内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:

Java代码
  1. package  MyTest;  
  2. public   class  bean {  
  3.         private  String id =  null  ;  
  4.         private  String name =  null  ;  
  5.   
  6.         public  String getId() {  
  7.                 return  id;  
  8.         }  
  9.         public   void  setId(String id) {  
  10.                 this .id = id;  
  11.         }  
  12.   
  13.         public  String getName() {  
  14.                 return  name;  
  15.         }  
  16.         public   void  setName(String name) {  
  17.                 this .name = name;  
  18.         }  
  19. }  
  20.   
  21. package  MyTest;  
  22. import  java.beans.BeanInfo;  
  23. import  java.beans.EventSetDescriptor;  
  24. import  java.beans.Introspector;  
  25. import  java.beans.MethodDescriptor;  
  26. import  java.beans.PropertyDescriptor;  
  27. import  java.lang.reflect.Method;  
  28. public   class  myBeanIntrospector {  
  29. public  myBeanIntrospector()     
  30.   {     
  31.    try     
  32.    {     
  33.     //实例化一个Bean      
  34.     bean beanObj = new  bean();     
  35.     //依据Bean产生一个相关的BeanInfo类      
  36.     BeanInfo bInfoObject =      
  37.     Introspector.getBeanInfo(beanObj.getClass(),beanObj.getClass().getSuperclass());     
  38.     //定义一个用于显示的字符串      
  39.     String output = "" ;     
  40.      
  41.     //开始自省      
  42.        
  43.     /*    
  44.     * BeanInfo.getMethodDescriptors()    
  45.     * 用于获取该Bean中的所有允许公开的成员方法,以MethodDescriptor数组的形式返回    
  46.     *    
  47.     * MethodDescriptor类    
  48.     * 用于记载一个成员方法的所有信息    
  49.     * MethodDescriptor.getName()    
  50.     * 获得该方法的方法名字    
  51.     * MethodDescriptor.getMethod()    
  52.     * 获得该方法的方法对象(Method类)    
  53.     *    
  54.     * Method类    
  55.     * 记载一个具体的的方法的所有信息    
  56.     * Method.getParameterTypes()    
  57.     * 获得该方法所用到的所有参数,以Class数组的形式返回    
  58.     *    
  59.     * Class..getName()    
  60.     * 获得该类型的名字    
  61.     */     
  62.     output = "内省成员方法:\n" ;     
  63.     MethodDescriptor[] mDescArray = bInfoObject.getMethodDescriptors();     
  64.     for  ( int  i= 0 ;i<mDescArray.length ;i++ )     
  65.     {     
  66.      //获得一个成员方法描述器所代表的方法的名字      
  67.      String methodName = mDescArray[i].getName();     
  68.           
  69.      String methodParams = new  String();     
  70.      //获得该方法对象      
  71.      Method methodObj = mDescArray[i].getMethod();     
  72.      //通过方法对象获得该方法的所有参数,以Class数组的形式返回      
  73.      Class[] parameters = methodObj.getParameterTypes();     
  74.      if  (parameters.length> 0 )     
  75.      {     
  76.       //获得参数的类型的名字      
  77.       methodParams = parameters[0 ].getName();     
  78.       for  ( int  j= 1 ;j<parameters.length ;j++ )     
  79.       {     
  80.        methodParams = methodParams + ","  + parameters[j].getName();     
  81.       }     
  82.      }     
  83.      output += methodName + "("  + methodParams +  ")\n" ;     
  84.     }     
  85.     System.out.println(output);     
  86.        
  87.     /*    
  88.     * BeanInfo.getPropertyDescriptors()    
  89.     * 用于获取该Bean中的所有允许公开的成员属性,以PropertyDescriptor数组的形式返回    
  90.     *    
  91.     * PropertyDescriptor类    
  92.     * 用于描述一个成员属性    
  93.     *    
  94.     * PropertyDescriptor.getName()    
  95.     * 获得该属性的名字    
  96.     *    
  97.     * PropertyDescriptor.getPropertyType()    
  98.     * 获得该属性的数据类型,以Class的形式给出    
  99.     *    
  100.     */     
  101.     output = "内省成员属性:\n" ;     
  102.     PropertyDescriptor[] mPropertyArray = bInfoObject.getPropertyDescriptors();     
  103.     for  ( int  i= 0 ;i<mPropertyArray.length ;i++ )     
  104.     {     
  105.      String propertyName = mPropertyArray[i].getName();     
  106.      Class propertyType = mPropertyArray[i].getPropertyType();     
  107.      output += propertyName + " ( "  + propertyType.getName() +  " )\n" ;     
  108.     }     
  109.     System.out.println(output);     
  110.        
  111.      
  112.     /*    
  113.     * BeanInfo.getEventSetDescriptors()    
  114.     * 用于获取该Bean中的所有允许公开的成员事件,以EventSetDescriptor数组的形式返回    
  115.     *    
  116.     * EventSetDescriptor类    
  117.     * 用于描述一个成员事件    
  118.     *    
  119.     * EventSetDescriptor.getName()    
  120.     * 获得该事件的名字    
  121.     *    
  122.     * EventSetDescriptor.getListenerType()    
  123.     * 获得该事件所依赖的事件监听器,以Class的形式给出    
  124.     *    
  125.     */     
  126.     output = "内省绑定事件:\n" ;     
  127.     EventSetDescriptor[] mEventArray = bInfoObject.getEventSetDescriptors();     
  128.     for  ( int  i= 0 ;i<mEventArray.length ;i++ )     
  129.     {     
  130.      String EventName = mEventArray[i].getName();     
  131.      Class listenerType = mEventArray[i].getListenerType();     
  132.      output += EventName + "("  + listenerType.getName() +  ")\n" ;     
  133.     }     
  134.     System.out.println(output);     
  135.     System.out.println("write by esonghui :" );     
  136.        
  137.    }     
  138.    catch  (Exception e)     
  139.    {     
  140.     System.out.println("异常:"  + e);     
  141.    }     
  142.   }     
  143.   public   static   void  main(String[] args)      
  144.   {     
  145.    new  myBeanIntrospector();     
  146.   }     
  147. }  
package MyTest;
public class bean {
        private String id = null ;
        private String name = null ;

        public String getId() {
                return id;
        }
        public void setId(String id) {
                this.id = id;
        }

        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
}

package MyTest;
import java.beans.BeanInfo;
import java.beans.EventSetDescriptor;
import java.beans.Introspector;
import java.beans.MethodDescriptor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class myBeanIntrospector {
public myBeanIntrospector()   
  {   
   try  
   {   
    //实例化一个Bean   
    bean beanObj = new bean();   
    //依据Bean产生一个相关的BeanInfo类   
    BeanInfo bInfoObject =    
    Introspector.getBeanInfo(beanObj.getClass(),beanObj.getClass().getSuperclass());   
    //定义一个用于显示的字符串   
    String output = "";   
   
    //开始自省   
     
    /*  
    * BeanInfo.getMethodDescriptors()  
    * 用于获取该Bean中的所有允许公开的成员方法,以MethodDescriptor数组的形式返回  
    *  
    * MethodDescriptor类  
    * 用于记载一个成员方法的所有信息  
    * MethodDescriptor.getName()  
    * 获得该方法的方法名字  
    * MethodDescriptor.getMethod()  
    * 获得该方法的方法对象(Method类)  
    *  
    * Method类  
    * 记载一个具体的的方法的所有信息  
    * Method.getParameterTypes()  
    * 获得该方法所用到的所有参数,以Class数组的形式返回  
    *  
    * Class..getName()  
    * 获得该类型的名字  
    */  
    output = "内省成员方法:\n";   
    MethodDescriptor[] mDescArray = bInfoObject.getMethodDescriptors();   
    for (int i=0;i<mDescArray.length ;i++ )   
    {   
     //获得一个成员方法描述器所代表的方法的名字   
     String methodName = mDescArray[i].getName();   
        
     String methodParams = new String();   
     //获得该方法对象   
     Method methodObj = mDescArray[i].getMethod();   
     //通过方法对象获得该方法的所有参数,以Class数组的形式返回   
     Class[] parameters = methodObj.getParameterTypes();   
     if (parameters.length>0)   
     {   
      //获得参数的类型的名字   
      methodParams = parameters[0].getName();   
      for (int j=1;j<parameters.length ;j++ )   
      {   
       methodParams = methodParams + "," + parameters[j].getName();   
      }   
     }   
     output += methodName + "(" + methodParams + ")\n";   
    }   
    System.out.println(output);   
     
    /*  
    * BeanInfo.getPropertyDescriptors()  
    * 用于获取该Bean中的所有允许公开的成员属性,以PropertyDescriptor数组的形式返回  
    *  
    * PropertyDescriptor类  
    * 用于描述一个成员属性  
    *  
    * PropertyDescriptor.getName()  
    * 获得该属性的名字  
    *  
    * PropertyDescriptor.getPropertyType()  
    * 获得该属性的数据类型,以Class的形式给出  
    *  
    */  
    output = "内省成员属性:\n";   
    PropertyDescriptor[] mPropertyArray = bInfoObject.getPropertyDescriptors();   
    for (int i=0;i<mPropertyArray.length ;i++ )   
    {   
     String propertyName = mPropertyArray[i].getName();   
     Class propertyType = mPropertyArray[i].getPropertyType();   
     output += propertyName + " ( " + propertyType.getName() + " )\n";   
    }   
    System.out.println(output);   
     
   
    /*  
    * BeanInfo.getEventSetDescriptors()  
    * 用于获取该Bean中的所有允许公开的成员事件,以EventSetDescriptor数组的形式返回  
    *  
    * EventSetDescriptor类  
    * 用于描述一个成员事件  
    *  
    * EventSetDescriptor.getName()  
    * 获得该事件的名字  
    *  
    * EventSetDescriptor.getListenerType()  
    * 获得该事件所依赖的事件监听器,以Class的形式给出  
    *  
    */  
    output = "内省绑定事件:\n";   
    EventSetDescriptor[] mEventArray = bInfoObject.getEventSetDescriptors();   
    for (int i=0;i<mEventArray.length ;i++ )   
    {   
     String EventName = mEventArray[i].getName();   
     Class listenerType = mEventArray[i].getListenerType();   
     output += EventName + "(" + listenerType.getName() + ")\n";   
    }   
    System.out.println(output);   
    System.out.println("write by esonghui :");   
     
   }   
   catch (Exception e)   
   {   
    System.out.println("异常:" + e);   
   }   
  }   
  public static void main(String[] args)    
  {   
   new myBeanIntrospector();   
  }   
}
 

 

 

分享到:
评论

相关推荐

    JAVA的内省机制(introspector)与反射机制(reflection).docx

    "JAVA的内省机制(introspector)与反射机制(reflection)" JAVA 的内省机制(introspector)和反射机制(reflection)是两个重要的概念,在 JAVA 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...

    Java 内省(Introspector)深入理解

    Java内省(Introspector)是Java语言提供的一种机制,用于在运行时分析Java对象的属性、方法和事件。这个特性对于开发人员来说非常有用,因为它允许程序动态地检查和修改对象的状态,而不必了解对象的具体实现细节。...

    Java中的内省与反射.doc

    ### Java中的内省与反射详解 #### 一、引言 在深入了解Java语言的过程中,我们会遇到两个重要的概念:反射和内省。这两种技术在实际开发中有着广泛的应用,尤其是在需要进行动态操作或元数据处理的场景下尤为重要...

    Java 内省introspector相关原理代码解析

    Java 内省(Introspection)是Java提供的一种机制,允许程序在运行时检查对象的属性和方法。在Java中,内省主要用于处理JavaBean,即遵循特定规范的类,通常包含get、set方法以及默认构造器。JavaBean类使得数据封装...

    用反射和内省技术实现简单SpringIOC

    内省(Introspection)则是Java提供的一种用于获取和修改对象属性的能力,主要通过java.beans包中的Introspector和PropertyDescriptor类实现。它主要用于处理JavaBeans规范的对象,可以获取Bean的属性、事件和方法...

    java-beans-lite:轻量级且快速的java.beans.Introspector实现

    轻巧,快速的java.beans.Introspector重新实现,用于消除对Bean Introspection的java.desktop模块的依赖。 问题 JDK 9中引入的模块封装了Java标准库中的所有AWT,Swing,Image和Sound软件包。 除此之外,它还包含带...

    Java反射中java.beans包学习总结.docx

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。JavaBeans包(java.beans)提供了与JavaBeans组件交互的相关类和接口,这些组件是Java面向对象...

    Java基础学习43.pdf

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。在Java基础学习中,理解并掌握反射是非常关键的一步,因为这不仅可以帮助你深入理解Java的内在机制,还能提升你在...

    Java基础加强(上) 经典ppt

    讲一些经典的:静态导入 自动装箱/拆箱 增强for循环 可变参数 内省(Introspector) — JavaBean ......

    JavaBean及内省文档

    内省是 Java 提供的一种机制,用于动态地获取对象的属性信息。通过使用 `java.beans.Introspector` 类,可以在运行时发现 JavaBean 的属性并进行操作。 在 J2EE 应用中,内省机制常用于框架自动识别 JavaBean 的...

    java.beans.*

    在 Android 中,虽然没有直接使用 Bean 的 introspection,但反射(Reflection)在某些情况下仍然是有用的。 7. **Design Time Support**: Java Beans 通常用于构建可视化设计工具,如 Eclipse 或 IntelliJ IDEA 中...

    java深度复制源代码

    - **反射机制**:该工具类大量使用了Java反射API(如`Introspector.getBeanInfo()`、`PropertyDescriptor`等)来获取和设置JavaBean的属性。 - **泛型**:使用了泛型`&lt;T&gt;`,使得该工具类可以应用于任意类型的...

    example_reflection:反射可能性的简单示例

    下面将详细介绍Java反射机制及其常见应用。 首先,反射的核心类是`java.lang.Class`,它代表运行时的类信息。通过`Class`对象,我们可以获取到类的名字、构造器、方法、字段等信息。例如,我们可以通过类名获取其...

    使用betwixt进行xml与java类之间的互转解析--代码

    本篇文章将深入探讨如何使用Betwixt库实现XML与Java类之间的互转解析。 首先,我们需要理解Betwixt的基本概念。Betwixt是一个XML绑定工具,它允许开发者通过注解或XML配置文件来映射XML结构与Java类的属性。这种...

    如何利用反射批量修改java类某一属性的代码详解

    反射机制在 Java 中的应用 - 批量修改 Java 类某一属性 在 Java 中,反射机制是一种非常重要的技术,它可以在运行时动态地获取和修改类的信息。在本文中,我们将详细介绍如何利用反射机制批量修改 Java 类某一属性...

    用于提高java技术的资料 javaBeAN

    2. **Introspector**:Java提供了一个名为`Introspector`的工具类,它能自动查找JavaBean的属性、方法和事件,便于操作JavaBean。 3. **JSP和Servlet中的JavaBean**:在Web开发中,JavaBean常被用作JSP页面和...

    使用struts2的Introspector做日志

    Struts2是一个流行的Java web框架,它为构建MVC(模型-...总之,通过Struts2的Introspector和拦截器机制,开发者可以轻松地集成日志功能,提供透明且全面的日志记录,这对于优化和维护Java web应用来说是非常有价值的。

    java加强笔记

    - **内省**是指Java程序能够访问并处理自身结构的能力。通过`java.beans`包提供的API,可以实现对象状态的查询和修改。 - 例如:使用`Introspector`和`PropertyDescriptor`来获取和设置对象的属性。 ##### 6. 注解...

    java白皮书 java电子书

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司的一部分)于1995年发布。它的设计目标是提供“一次编写,到处运行”的能力,使得开发者能够编写在不同平台上运行的代码。Java白皮书是...

    java最全的API帮助文档

    "Java最全的API帮助文档"是Java开发者的必备参考资料,它详尽地列出了Java平台上的所有类、接口、枚举以及注解,覆盖了Java SE(标准版)、Java EE(企业版)和Java ME(微型版)等不同领域。 `javaBeans`是Java...

Global site tag (gtag.js) - Google Analytics