http://yangzhibin-java.iteye.com/blog/452068

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

  • 博客分类:
  • j2se
JavaBeanJ#

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

JAVA的内省机制(introspector)与反射机制(reflection)相关推荐

  1. 深入理解Java类型信息(Class对象)与反射机制

    关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java并发之synchronize ...

  2. 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等

    这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...

  3. java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点

    关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...

  4. java 有哪些反射机制_Java 的反射机制你了解多少?

    不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...

  5. java 反射机制性能_Java反射机制的用途和缺点

    Java反射机制的用途和缺点 反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ab ...

  6. Java在远程方法调用中运用反射机制

    我们将介绍反射机制在网络编程中的应用,实现如何在客户端通过远程方法调用服务器端的方法. 假定在服务器端有一个 HelloService 接口,该接口具有 getTime() 和 echo() 方法,具 ...

  7. java反射机制到底是什么?

    1.什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...

  8. Java基础知识——类装载器与反射机制

    类装载器ClassLoader 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件. 类装载器把一个类装入JVM中,要经过三步: 1.装载:查找和导入Class文件: 2.链接:执行 ...

  9. 初识java反射机制

    这篇小博客有这么些内容~认识何使用java反射机制的心路历程 什么是java反射机制呢?什么时候会用到java反射机制呢?怎么使用java反射机制呢? 那我们开始吧~ (一)反射机制(Reflecti ...

  10. 工作中用到的java反射机制_(转)JAVA-反射机制的使用

    Java反射机制的实现原理 反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠 ...

最新文章

  1. 清华优秀毕业生放弃留学上热搜!计算机系前10名中9人留校深造
  2. 大数据笔记2019.5.11
  3. android http2.0请求,Android http HttpURLConnection
  4. Cpp 对象模型探索 / 对象访问成员变量的原理
  5. python解释器下安装z3_再次:在Windows上安装Z3 Python
  6. 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
  7. Ubuntu20.04安装eBPF BCC
  8. 红帽高级总监谈 OpenJDK 的未来:Java 的未来从未如此光明
  9. Ubuntu中切换用户
  10. AWS codecommit 的学习记录
  11. JavaScript 的等式对照表
  12. android 动画基础,Android 动画基础
  13. Android ActivityManager常用方法
  14. 乐高叉车wedo教案_乐高 WEDO自带12个活动教学参考书.pdf
  15. excel 如何冻结多行多列
  16. 小学校本课程计算机前言,《创意手工》三河小学校本课程——序言
  17. 如何助力鸿蒙发展,实话实说:华为以一已之力,能不能推动鸿蒙系统的发展 - 区块网...
  18. keras中的K.gradients()函数
  19. 基于PG与PostGIS搭建实时矢量瓦片服务
  20. 批量给word添加水印,word魔方顺利完成

热门文章

  1. 中国大学MOOC 编译原理 第6讲测验
  2. 大数据WEB阶段(九)Servlet+Request
  3. 【C++】Visual Studio教程(七) -修改 Visual Studio
  4. php截取字符串 xml,php截取字符串并保留完整xml标签的函数代码_php技巧
  5. opencv求两张图像光流_光流(optical flow)和openCV中实现
  6. python迭代器和生成器_Python之迭代器和生成器
  7. springboot mybatis ehcache_SpringBoot入门建站全系列(十四)集成Redis缓存
  8. php nsdata,在iPhone中加密nsdata并在php中解密
  9. python3遍历选中文件夹下的文件【GUI编程】
  10. 【汇编语言(第3版)王爽】试验7 寻址方式在接过话数据访问中的应用(代码+注释)