Java反射机制介绍
1. 文档概述
Java反射是Java被视为动态(或准动态)语言的一个关键性质,Java反射机制容许程序在运行时加载、探知、使用编译期间完全未知的classes。换言之,Java可以加载一个运行时才得知名称的class,获得其完整结构。
在工作过程中,常会听到反射这个概念,在平常的代码开发中也有看到和使用到,只是对它没有一个较深入的了解,这次重新理解学习了一下反射机制,结合公司产品中的Hotweb框架,加深理解,本文为学习过程中的总结。
2. 目标读者
- 数通畅联内部员工
- 广大计算机爱好者
3. 术语解释
静态加载类(编译时加载类):大多数情况下都是使用这种形式。比如我们定义了一个类A,实例化采用A a = new A()接着就可以通过a对象调用相关方法或属性,这就是静态加载类的过程。
动态加载类(运行时加载类):所谓动态加载类,只需要通过Class c = Class.forName("类的全名")即可获得类类型,然后通过调用A a = c.newInstance()方法即可实例化这个类。
本质的区别在于静态加载的类的源程序在编译时期加载(必须存在),而动态加载的类在编译时期可以缺席(源程序不必存在)。
反射机制:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
4. 反射功能
反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类所具有的成员变量和方法;
- 在运行时调用任意一个对象的方法;
- 生成动态代理。
在JDK中,主要通过以下类实现java反射机制,这些类都位于java.lang.reflect包中。
- Class:代表一个类
- Filed:代表类的成员变量或者说成员属性
- Method:代表类的方法
- Constructor:代表类的构造方法
- Array:提供了动态创建数组,以及访问数组元素的静态方法
首先,需要定义测试使用的类


4.1. 获取类的Class对象
Class 类的实例,表示正在运行的 Java 应用程序中的类和接口。获取类的Class对象有多种方式:

可以通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值。JAVA 的Class<T>类提供了几个方法获取类的属性。
4.2. 获取类的Fields

使用样例如下图所示:

可见getFields和getDeclaredFields区别:
getFields返回的是申明为public的属性,包括父类中定义,
getDeclaredFields返回的是指定类定义的所有定义的属性,不包括父类的。
4.3. 获取类的Method
通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法
Class<T>类提供了几个方法获取类的方法。

使用样例如下图所示:

4.4. 获取类的Constructor
通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例
Class<T>类提供了几个方法获取类的构造器。

使用样例如下图所示:

4.5. 新建类的实例
通过反射机制创建新类的实例,有几种方法可以创建

通过反射获取类Method对象,调用Field的Invoke方法调用函数。
4.6. 调用类的函数

调用后结果如下图所示

上面失败是由于没有权限调用private函数,这里需要设置Accessible为true;

4.7. 设置/获取类的属性值
通过反射获取类的Field对象,调用Field方法设置或获取值

调用后结果如下图:

4.8. 实例化对象并调用其方法
Person中有两个方法,sayHi和sayHello

通过已定义的类字符串变量,实例化该类,创建对象,然后根据传入的方法参数,调用Person中的方法

调用后结果如下图:

不管是类名还是方法名,都可以定义在配置文件中,然后读取实例化、方法调用,通常Java web框架都是如此,数通畅联Hotweb MVC框架也有类似机制,具体参加5.4节。
5. 应用实例
5.1. ArrayList中存放对象
在泛型为Integer的ArrayList中存放一个String类型的对象。

5.2. 修改数组的信息
修改数组的信息实例,如下图:

5.3. 修改数组的大小
修改数组的大小实例,如下图:

5.4. Hotweb框架经典样例
以数通畅联基础Hotweb MVC框架为例说明反射机制
首先,在DispatchServlet转发请求至Handler时,需要实例化handler对象。

其中,在HandlerParser类中,使用handlerId通过配置文件HandlerModule.xml读取到对应Handler并实例化。

然后,通过instantiateHandler方法,添加handler的属性,

最后,在实例化了handler对象后,通过传入名为actionType的变量参数调用handler中对应名称的方法。

在获取方法名的时候,默认是prepareDisplay


最后,通过反射得到的Method对象,调用Field的Invoke方法调用指定的函数。

Java反射机制介绍的更多相关文章
- Java 反射机制介绍
参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...
- Java 反射机制(包括组成、结构、示例说明等内容)
第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象” ...
- [转载]Java 反射机制(包括组成、结构、示例说明等内容)
FROM:http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们 ...
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- Java反射机制的学习
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
- Java 反射机制及Annotation
转自:http://justjavac.iteye.com/blog/714654 Java 反射是 Java 语言的一个很重要的特征. 它允许运行中的 Java 程序对自身进行检查,并能直接操作程序 ...
- Java反射机制(转载)
原文链接:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html Java反射机制是Java语言被视为准动态语言的关键性质.Jav ...
- Java 反射机制浅析
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...
- java反射机制入门01
java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...
随机推荐
- tomcat 配置域名访问应用
<Host appBase="webapps" autoDeploy="true" name="www.XXX.com" unpack ...
- strace使用
统计信息 -c -- count time, calls, and errors for each syscall and report summary 输出结果到文件 -o 例如 strace ...
- 之前的一些Oracle的经验总结
1. 安装: 1) 关于字符集的选择,现在还不很了解,修改是需要进入一个模式下才可以修改,当然新建一个数据库实例的时候可以重新设定: UTF8是相对比较大的一个字符集, 可以简单实用这个就能保存很多的 ...
- 关于 Web Api 2 认证与授权
认证与授权 认证与授权,Authentication and Authorize,这个是两个不同的事.认证是对访问身份进行确认,如验证用户名和密码,而授权是在认证之后,判断是否具有权限进行某操作,如 ...
- django网页图片验证码功能
在一个正常的登录系统中,验证码是非常重要的,用于识别人机,毕竟我们都知道,这个世界中存在着万恶的爬虫,验证码有很多种方式,有图片的,有邮件的,有短信的,有拼图的,不管什么样的验证码,目的都是验证访问用 ...
- 23.Xcode中常用的快捷键操作
1.工程导航器:command+1 浏览文件夹,控制器,图片等 2.显示/隐藏导航器面板:Command+0 隐藏左边工具栏 3.显示/隐藏实用工具面板:Command+Option+0 使用工具面板 ...
- oracle远程连接
1.1.1 修改文件: 1.1.2 修改net Manager(可省略) 1.1.3 修改任何都需要重启oracle监听和启动服务
- 普通用户修改.bash_profile 权限问题
例如oracle用户想要修改它下面的.bash_profile文件: 在命令行运行: [root@localhost ~]# ls -lh /home/oracle/.bash_profile
- tomcat部署项目访问不加项目名方法
直接主题:tomcat部署项目访问不加项目名方法是打开tomcat的conf目录下server.xml文件 加入 <Context path="" docBase=" ...
- Codeforces Round#412 Div.2
A. Is it rated? 题面 Is it rated? Here it is. The Ultimate Question of Competitive Programming, Codefo ...