|
1 | | -# What is reflection, and why is it useful? |
| 1 | +# 反射(reflection)是什么及其用途? |
2 | 2 |
|
3 | 3 | ##问题描述
|
4 | 4 | 反射是什么,为什么它是有用的?
|
5 | 5 | 我特别感兴趣的是java,但我认为任何语言的原理都是相同的。
|
6 | 6 |
|
7 | 7 | ##回答
|
8 | | -反射是被用来描述代码的,可以检查同一系统(或者自身)的其他代码。 |
| 8 | +反射的概念,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。在java中,通过反射,能够在"运行态"动态获得任意一个类的所有属性和方法,动态地调用对象的方法。 |
9 | 9 |
|
10 | | -举个例子,在java中你有一个不知道具体类型的对象,并且你可能会调用它的dosomething的方法(如果存在的话)java的静态类型系统并没有设计来支持此用法,除非对象符合已知的接口。但是用反射,你的代码能查看对象,并找出一个dosomething的方法(如果有的话),然后你可以调用他。 |
11 | | -因此,一个例子如下(想象在问题中的对象foo): |
| 10 | +举个例子,假设你有一个不知道具体类的对象,并且你想调用它的"dosomething"方法(如果存在的话)。java的静态类型系统只能调用一个已知类对象对应的已知接口,在未指定对象类型时,无法调用它的方法。但是通过反射,你的代码能检查这个未知类对象,并试图找出这个dosomething方法。如果存在这个方法,你可以通过反射调用这个方法。 |
| 11 | + |
| 12 | +为了进一步说明,请看下面的例子(下面的对象foo,就是上文提到的,我们不知道它对应的类是什么): |
12 | 13 | ```
|
13 | 14 | Method method = foo.getClass().getMethod("dosomething",null);
|
14 | 15 | method.invoke(foo,null); //调用foo的dosomething方法
|
15 | 16 | ```
|
16 | | -java中一个非常常见的用例是使用注释。JUnit 4,举个例子,将使用反射来浏览你的标记有@test注释的类方法,之后当运行测试单元时进行调用。 |
| 17 | +反射这个特性,经常会用于各种注解中(annotations)。举个例子,Junit4将使用反射来遍历你的代码,查找所有加了@test注解的类方法,之后运行测试单元时就调用这些方法。 |
17 | 18 |
|
18 | 19 | [有很多好的反射例子,可以用来入门](http://docs.oracle.com/javase/tutorial/reflect/index.html)
|
19 | 20 |
|
20 | | -最后,其概念在其他支持反射的静态类型语言中是非常相似的。在动态语言中,上面描述的用例并不是必要的(因为编译器允许任何方法都能被任何对象调用,在运行时如果不存在就会失败),但是第二种情况,寻找能以某种确定的方式工作的方法任然是常见的。 |
| 21 | +最后,其概念在其他支持反射的静态类型语言中也是非常相似的。在动态语言中,无需用到上面说的第一种用法场景——调用未知类的方法(因为动态语言编允许任意对象调用任意方法,如果不存在对应方法,在运行时就会失败),但是第二种情况,查找做了指定标记的方法,这种场景还是很常见的 |
21 | 22 |
|
22 | | -[原文链接:What is reflection, and why is it useful?](http://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful) |
| 23 | +[stackoverflow链接:What is reflection, and why is it useful?](http://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful) |
23 | 24 |
|
24 | 25 |
|
0 commit comments