`

JAVA的内省机制(introspector)与反射机制(reflection)----转载http://yangzhibin-java.iteye.com/b

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

Java代码 
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 编程中扮演着至关重要的角色。那么,什么是内省机制和反射机制?它们...

    Python库 | plone.introspector-0.1.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:plone.introspector-0.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Java中的内省与反射.doc

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

    Java 内省(Introspector)深入理解

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

    openbeans1.0.zip

    //import java.beans.BeanInfo; //import java.beans.IntrospectionException; //import java.beans.Introspector; //import java.beans.PropertyDescriptor; import com.googlecode.openbeans.BeanInfo; import ...

    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面向对象...

    compactbeans:JavaSE紧凑概要文件1的java.beans。*的实现-开源

    这是针对Java 1.8SE Compact Profile 1的java.beans.Introspector和关联的Descriptor类的分离实现。该代码基于openjdk源包。 目的是尽可能实现API兼容性。 在最简单的情况下,只需执行包导入重命名。 可以在GitHub上...

    struts2+hibernate+spring

    Struts2、Hibernate与Spring(通常简称为SSH)是Java Web开发中的三个流行框架。它们的结合可以极大地提高Web应用的开发效率和可维护性。具体来说: - **Struts2**:用于构建MVC架构的应用程序,它负责处理用户的...

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.tar.gz)

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.tar.gz) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...

    前端-后端java的Util类的工具类

    │ │ ftp二进制与ascii传输方式区别.txt │ │ IPDeal.java │ │ Md5.java │ │ MD5Encrypt.java │ │ MyFileFilter.java │ │ PropsUtil.java │ │ RegExUtil.java │ │ SimpleConfig.java │ │ ...

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

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

    java深度复制源代码

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

    java.beans.*

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

    commons-beanutils-1.9.2-bin.zip

    在Java中,Sun公司提供的内省(Introspection)API,如java.beans.PropertyDescriptor和java.beans.Introspector,虽然强大但确实相对复杂,不便于开发者快速访问和修改Bean的属性。BeanUtils库则通过提供一套更直观...

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.zip)

    Neo4j GraphQL 库(graphql--neo4j-introspector-1.0.1.zip) 源代码。 Neo4j GraphQL 库是一个高度灵活、低代码、开源的 JavaScript 库,可通过利用连接数据的力量为跨平台和移动应用程序实现快速 API 开发。 ...

    Java-network-high-level-programming.rar_java programming

    Java网络编程是Java开发中的重要领域,它涵盖了各种用于创建分布式系统和应用程序的技术。本教程“Java-network-high-level-programming”旨在深入解析Java在网络编程方面的高级概念和实践,包括网络进程通信、JSP...

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

    在Java开发中,XML作为一种通用的数据交换格式,广泛用于存储和传输数据。为了方便地将XML文档转换为Java对象,以及将Java对象序列化为XML,Apache软件基金会提供了一个名为Betwixt的库。本篇文章将深入探讨如何使用...

    Java基础学习43.pdf

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

Global site tag (gtag.js) - Google Analytics