关于java:反思:有效,令人敬畏,必要的用途

Reflection: Effective, Awesome, Necessary uses

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicates:
What is reflection, and why is it useful?

所以我已经阅读了Java网站上的反射教程,我想我一般理解它允许一个类来检查自己,访问属性、方法等等。然而,如果有的话,它是如何与可变的或不可变的代码相关的呢?类是否可以使用反射之类的东西来更改自己的代码?如果不是,你所遇到/创造的反射最棒的用途是什么?

谢谢!


不,反射不会直接使类更改其代码。但是,使用java.lang.reflect.proxy可以做一些很棒的事情,例如编写实现任何JavaBean样式接口(即set和get方法)的通用代码,甚至编写通过让所有方法返回默认值来实现任何接口的代码,甚至可能是递归的,即返回接口类型的方法返回ob。行为相同的对象。

这个工具被模拟对象库使用,而且可能最显著的是由groovy语言来实现支持duck类型和monkey补丁的完全动态语言。


Java反射不允许你动态地改变程序的代码,就像你可以用Ruby之类的动态语言那样。

Java反射使您可以看到有关类的方法和属性的元数据。它还允许您调用这些方法或更改属性值,而不必事先了解可用的方法和属性。

要在Java中运行时修改程序代码,请看面向方面的编程。

我见过的最棒的用法是JRuby绑定,使Java类可以动态地用作Ruby代码。我自己也使用了反射,允许我从使用静态int常量而不是枚举的第三方库中查找错误代码。