反射机制

反射是一种自我管理机制--------框架中使用!

 

通过反射可实现:

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程序在运行时能够看到自己的结构和行为,就像看到镜子当中的自己一样,反射了出来

如果扩展一点,这种用代码来生成代码的方式,其实叫做"元编程"

 

posted @ 2018-05-07 19:10  muskwang  阅读(133)  评论(0编辑  收藏  举报