名称反射用于描述能够检查同一系统(或本身)中的其他代码的代码。
例如,假设您在Java中有一个未知类型的对象,并且想在该对象上调用“ doSomething”方法(如果存在)。除非对象符合已知的接口,否则Java的静态类型化系统并不是真正为支持该类型而设计的,但是使用反射,您的代码可以查看该对象并确定其是否具有名为“ doSomething”的方法,然后在需要时调用该方法。想要。
因此,给您一个用Java编写的代码示例(假设有问题的对象是foo):
Method method = foo.getClass().getMethod("doSomething", null);method.invoke(foo, null);Java中一种非常常见的用例是带注释的用法。例如,JUnit 4将使用反射来遍历类,以查找带有@Test批注的方法,然后在运行单元测试时调用它们。
有一些不错的反思示例,可帮助您入门:http://docs.oracle.com/javase/tutorial/reflect/index.html
最后,是的,这些概念在其他支持反射的静态类型语言(如C#)中非常相似。在动态类型的语言中,上述用例不是必需的(因为编译器将允许在任何对象上调用任何方法,如果该方法不存在,则在运行时将失败),但是第二种情况是查找标记或以某种方式工作仍然很普遍。
来自评论的更新:
检查系统中的代码并查看对象类型的能力不是反射,而是类型自省。然后,反射就是利用自省功能在运行时进行修改的能力。这里的区别是必要的,因为某些语言支持自省,但不支持反射。这样的例子就是C ++



