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对象进行操作, 包括创建这个类的实例, 设置一个属性的值,调用这个类的方法等等。
领取专属 10元无门槛券
私享最新 技术干货