反射是一种自我管理机制--------框架中使用!
通过反射可实现:
1.在运行时判断任意一个对象所属的类
2.在运行时构造任意一个类的对象
3.在运行时判断任意一个类所具有的成员变量和方法
4.在运行时调用任意一个对象的方法
反射能让你在运行时而不是编程时做下面的事情:
(1) 获取一个类的内部结构信息(或者成为元数据), 包括包名,类名, 类所有的方法,
(2) 运行时对一个Java对象进行操作, 包括创建这个类的实例, 设置一个属性的值, 调用这个类的方法等等。
用java的反射功能,根据一个类new出一个实例
第一步,先把HelloWorld的类装载进来
Class cls = Class.forName("com.example.HelloWorld");
第二步,创建一个HelloWorld的实例,注意,这里并没有用强制转型把obj转成HelloWorld
Object obj = cls.newInstance();
第三步,得到这个类的方法,注意,一个类的方法也是对象
Method m = cls.getDeclaredMethod("sayHello");
第四步,方法调用,输出"helloworld"
m.invoke(obj);
为什么不直接new出来呢?通过反射来创建对象,调用方法多麻烦?
关键在于:很多时候我们并不能事先知道要new什么对象,
相反,我们可能只知道一个类的名称和方法名,很多时候这些名称都是写在XML配置当中的
在java ee世界中,反射最大的作用就是支持以声明式的方法(在XML中)来描述应用的行为,是SSH最核心的技术
【Struts的例子】
1. 在XML配置文件中定义Action
<action name="HelloWorld" class="example.HelloWorld">
<result>/hello.jsp</result>
</action>
2. 定义Java 类
public class HelloWorld extends ExampleSupport {
public String execute() throws Exception {
......
return SUCCESS;
}
.......
}
Struts 框架的作者事先肯定不知道你会配置一个HelloWorld的Action 。
不过他可以这么做, Struts 在启动以后,解析你配置XML配置文件, 发现名称为HelloWorld的Action, 找到相对于的类名example.HelloWorld, 然后就可以通过反射去实例化这个类。 等到有人调用这个action 的时候, 可以通过反射来调用HelloWorld的execute() 方法。
为什么叫反射?
java程序在运行时能够看到自己的结构和行为,就像看到镜子当中的自己一样,反射了出来
如果扩展一点,这种用代码来生成代码的方式,其实叫做"元编程"