JAVA的内省机制(introspector)与反射机制(reflection)
http://yangzhibin-java.iteye.com/blog/452068
JAVA的内省机制(introspector)与反射机制(reflection)
- 博客分类:
- j2se
相对而言,反射比内省更容易理解一点。用一句比较白的话来概括,反射就是让你可以通过名称来得到对象 ( 类,属性,方法 ) 的技术,这种技术比内省机制使用范围更广泛。例如我们可以通过类名来生成一个类的实例;知道了方法名,就可以调用这个方法;知道了属性名就可以访问这个属性的值。 内省是 Java 语言对 Bean 类属性、事件的一种缺省处理方法。例如类 A 中有属性 name, 那我们可以通过 getName,setName 来得到其值或者设置新的值。通过 getName/setName 来访问 name 属性,这就是默认的规则。 Java 中提供了一套 API 用来访问某个属性的 getter/setter 方法,通过这些 API 可以使你不需要了解这个规则(但你最好还是要搞清楚),这些 API 存放于包 java.beans 中。
一般的做法是通过类 Introspector 来获取某个对象的 BeanInfo 信息,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后我们就可以通过反射机制来调用这些方法。下面我们来看一个例子,这个例子把某个对象的所有属性名称和值都打印出来:
- 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)相关推荐
- 深入理解Java类型信息(Class对象)与反射机制
关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java并发之synchronize ...
- 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等
这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...
- java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点
关注程序员7歌,一起用技术改变世界 大家好,我是程序员7歌,今天我为大家讲解Java的反射机制. 首先我们来看看反射的概念: Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和 ...
- java 有哪些反射机制_Java 的反射机制你了解多少?
不知道多少次听说过了Java反射机制的使用,比如:Spring 框架如何实例化IoC容器中的Bean,编码过程中如何动态的清理对象中的字段信息等等.工作中只是听说.看同事们编码实践,但是自己却只是概念 ...
- java 反射机制性能_Java反射机制的用途和缺点
Java反射机制的用途和缺点 反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ab ...
- Java在远程方法调用中运用反射机制
我们将介绍反射机制在网络编程中的应用,实现如何在客户端通过远程方法调用服务器端的方法. 假定在服务器端有一个 HelloService 接口,该接口具有 getTime() 和 echo() 方法,具 ...
- java反射机制到底是什么?
1.什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功 ...
- Java基础知识——类装载器与反射机制
类装载器ClassLoader 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件. 类装载器把一个类装入JVM中,要经过三步: 1.装载:查找和导入Class文件: 2.链接:执行 ...
- 初识java反射机制
这篇小博客有这么些内容~认识何使用java反射机制的心路历程 什么是java反射机制呢?什么时候会用到java反射机制呢?怎么使用java反射机制呢? 那我们开始吧~ (一)反射机制(Reflecti ...
- 工作中用到的java反射机制_(转)JAVA-反射机制的使用
Java反射机制的实现原理 反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠 ...
最新文章
- 清华优秀毕业生放弃留学上热搜!计算机系前10名中9人留校深造
- 大数据笔记2019.5.11
- android http2.0请求,Android http HttpURLConnection
- Cpp 对象模型探索 / 对象访问成员变量的原理
- python解释器下安装z3_再次:在Windows上安装Z3 Python
- 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则
- Ubuntu20.04安装eBPF BCC
- 红帽高级总监谈 OpenJDK 的未来:Java 的未来从未如此光明
- Ubuntu中切换用户
- AWS codecommit 的学习记录
- JavaScript 的等式对照表
- android 动画基础,Android 动画基础
- Android ActivityManager常用方法
- 乐高叉车wedo教案_乐高 WEDO自带12个活动教学参考书.pdf
- excel 如何冻结多行多列
- 小学校本课程计算机前言,《创意手工》三河小学校本课程——序言
- 如何助力鸿蒙发展,实话实说:华为以一已之力,能不能推动鸿蒙系统的发展 - 区块网...
- keras中的K.gradients()函数
- 基于PG与PostGIS搭建实时矢量瓦片服务
- 批量给word添加水印,word魔方顺利完成
热门文章
- 中国大学MOOC 编译原理 第6讲测验
- 大数据WEB阶段(九)Servlet+Request
- 【C++】Visual Studio教程(七) -修改 Visual Studio
- php截取字符串 xml,php截取字符串并保留完整xml标签的函数代码_php技巧
- opencv求两张图像光流_光流(optical flow)和openCV中实现
- python迭代器和生成器_Python之迭代器和生成器
- springboot mybatis ehcache_SpringBoot入门建站全系列(十四)集成Redis缓存
- php nsdata,在iPhone中加密nsdata并在php中解密
- python3遍历选中文件夹下的文件【GUI编程】
- 【汇编语言(第3版)王爽】试验7 寻址方式在接过话数据访问中的应用(代码+注释)