听说过反射吗? 它是一种强大的Java技术,使JVM可以处理开发人员不知道的对象。 有一个专用的完整API:它位于java.lang.reflect
包下。
例如,我曾经创建一个RPC Web服务引擎,该引擎可以启动任何类的任何方法,只要在类路径上可以找到足够的类即可。 这确实不是很难。
但是反射的真正力量在于它能够从任何代码中调用不可访问的方法。 是的,反射使开发人员可以调用私有方法! 为何如此?
让我们举个例子:
public class MyClass {
private void myPrivateMethod () {
...
}
}
如您所知,在正常情况下,只有MyClass
类的实例才能调用myPrivateMethod
方法。
以下内容将向您显示相反的内容:
public class ReflectionExample {
public void callPrivateMethod () throws Exception {
// Create a reference on the private method
Method myPrivateMethod = MyClass . class . getDeclaredMethod (& quot ; myPrivateMethod & quot ;);
// This make it possible to call a unaccessible method
myPrivateMethod . setAccessible ( true );
// Create a new instance of my class
MyClass myClass = new MyClass ();
// Invoke the method here
myPrivateMethod . invoke ( myClass );
}
}
瞧! 即时私有方法调用。 真正的功能在于第9行。它有效地告诉JVM忽略访问权限。 可怕的想法,不是吗? 好吧,事实并非如此:如果安全管理器拒绝它们的执行权,则以上所有代码行都将引发SecurityException
。 因此,代码永远不会在一个受保护的沙盒中运行(如Java Web Start的或小程序)。
这种策略的用途是无限的:
- 去耦,
- 控制反转(Spring如何设法注入您的资源?),
- 相对于测试的体系结构自由度(不再需要软件包可见性),
- Web服务RPC,
- 等等
还有其他想法吗?