Java的反射机制

Java反射机制

先来看个例子,假设我给你一个类:

现在要求:

(1) 你不能使用 Hello h = new Hello() , 但是要构建一个Hello的实例来.

(2) 调用sayHello() 方法,但是不能直接用 Hello实例的 h.sayHello()方法 .

用Java的反射功能, 可以很轻松的完成上面的要求:

为什么不直接new 出来呢?通过反射来创建对象,调用方法多费劲啊 ?

这是个好问题,关键点就是:很多时候我们并不能事先知道要new 什么对象,相反,我们可能只知道一个类的名称和方法名,很多时候这些名称都是写在XML配置文件中的。

来看看几个SSH的例子:

Struts的例子

在XML配置文件中定义Action

定义Java 类

Struts 框架的作者事先肯定不知道你会配置一个Hello的Action 。

不过他可以这么做, Struts 在启动以后,解析你配置XML配置文件, 发现名称为Hello的Action, 找到相对于的类名example.Hello, 然后就可以通过反射去实例化这个类。 等到有人调用这个Action 的时候, 可以通过反射来调用Hello的sayHello() 方法.

Hibernate的例子

定义Java类和表之间映射, 类名叫Event, 对应的表名是events 。

定义Event 类,如下所示:

查询, 你可以用Hibernate 这么查询表中的数据了

框架作者事先也不知道你会配置一个叫Event的类。

不过他会这么处理: 类名(Event)-> 数据库表名(events) -> 发出SELECT查询表数据 -> 通过反射创建Event的实例 -> 通过反射调用实例的setter方法把数据库的值设置进去

Spring的例子

配置一个Bean

写一个Java 文件

调用

无非是根据类的名称通过反射创建一个类Hello的实例, 然后再通过反射调用setMessage方法, 这样当你getMessage就有值了。

所以反射是很重要的,在Java EE世界里, 反射最大的用途就是支持以声明式的方法(在XML文件中)来描述应用的行为,是Struts, Hibernate , Spring 的最核心的技术之一。

简单的来讲, 反射能让你在运行时而不是编程时做下面的事情:

(1) 获取一个类的内部结构信息(或者成为元数据), 包括包名,类名, 类所有的方法,

(2) 运行时对一个Java对象进行操作, 包括创建这个类的实例, 设置一个属性的值,调用这个类的方法等等。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180727G1RE6100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励