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

Java的内省和反射

 
阅读更多

原文地址:http://java.chinaitlab.com/base/831819.html

 

相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术,这种技术比内省机制使用范围更广泛。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。 内省是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中的内省与反射.doc

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

    java反射全解(反射原理+反射API详解+反射与数组+反射与泛型+反射源码与性能开销+反射优缺点+反射与内省)

    java 反射机制是 Java 语言中的一种动态获取信息和调用对象方法的技术核心。它允许在程序运行时加载、探索以及使用编译期间完全未知的 .class 文件。通过反射机制,可以在运行时判断任意一个对象所属的类、构造任意...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射...以上内容不仅解释了Java反射机制的相关知识点,还通过示例代码进行了实践演示,希望能够帮助你在Java面试中更好地理解和运用这一重要特性。

    Java反射与内省-PPT

    Java反射与内省是Java编程语言中的核心特性,它们为开发者提供了强大的能力,可以在运行时检查和操作类、接口、对象及其属性。本PPT深入探讨了这些概念,旨在帮助开发者充分利用Java平台的灵活性。 首先,Java反射...

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

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

    Java 内省(Introspector)深入理解

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

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

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

    本篇文章将深入探讨如何利用反射和内省技术来实现一个简单的Spring IOC。首先,我们来理解什么是反射和内省。 反射是Java提供的一种强大的动态类型机制,它允许程序在运行时检查类的信息,如类名、属性、方法等,并...

    java反射原理

    总结来说,Java反射机制是Java语言的一个重要特性,它允许程序在运行时动态地加载、检测和使用类信息,极大地增强了Java的灵活性和扩展性。然而,正如任何强大工具一样,反射机制的使用也需遵循一定的原则,避免滥用...

    JAVA反射侯捷观点

    内省是指程序自我检查和理解的能力,而反射则是这一能力的具体实现,它使Java程序能够在运行时加载、检查和操作未知的类。 Java的反射API包括`java.lang.Class`以及`java.lang.reflect`包中的`Method`、`Field`和`...

    java反射机制.pdf

    Java反射机制允许程序在运行时通过`Reflection APIs`获取类的内部信息,包括修饰符(如`public`、`static`等)、父类(如`Object`)、接口(如`Cloneable`)以及字段和方法的信息,并能够在运行时改变字段的值或调用...

    java ioc,aop实现(内省),仿spring功能实现.

    Java IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented ...在源码和工具方面,我们可以学习到如何利用Java的内省API进行类信息的获取,以及如何利用反射和动态代理来实现依赖注入和面向切面编程。

    酷炫javaweb后台系统适合初学者【里面有封装 反射内省等】

    在这个"酷炫javaweb后台系统"中,包含了一些核心的JavaWeb技术和编程理念,如封装、反射和内省等。这些概念是Java编程的重要组成部分,对于理解和构建高效的应用程序至关重要。 首先,让我们来探讨一下"封装"。封装...

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

    `Introspector` 是Java内省的核心类,它提供了一系列的方法来获取关于JavaBean的信息。例如,`Introspector.getBeanInfo(Class)` 方法可以获取指定类的BeanInfo,这包含了关于类的属性(PropertyDescriptor)、事件...

    内省所需jar包

    1. `commons-beanutils-1.9.2.jar`:这是Apache Commons BeanUtils库的一个版本,它是对Java内省功能的一个扩展和封装。BeanUtils库提供了一种简单的方式来操作JavaBeans,即具有getter和setter方法的对象。它简化了...

    Java Reflection in Action

    Java反射机制是一种在运行时查询、监视和操作类、方法、字段和对象的机制,其提供了一种强大的编程能力,允许程序在运行时进行自我检查和调整行为。Java Reflection in Action这本书作为Java反射机制的经典之作,...

    类的反射机制您的网络连接,请

    Java中的反射机制是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。在Java 1.5引入的反射API使得开发者可以在编译期未知的情况下,动态地获取类的信息并执行相关操作。以下将详细介绍...

Global site tag (gtag.js) - Google Analytics