java反射--内省_Java-反射的力量

java反射--内省

听说过反射吗? 这是一种强大的Java技术,使JVM可以处理开发人员不知道的对象。 有一个专用的完整API:它位于java.lang.reflect包下。

例如,我曾经创建一个RPC Web服务引擎,该引擎可以启动任何类的任何方法,只要在类路径上可以找到足够的类即可。 这确实不是很难。

但是反射的真正力量在于它能够从任何代码调用不可访问的方法。 是的,反射使开发人员可以调用私有方法! 为何如此?

让我们举个例子:

publicclassMyClass{

    privatevoidmyPrivateMethod(){
        ...
    }
}

如您所知,在正常情况下,只有MyClass类的实例才能调用myPrivateMethod方法。

下面应该向您显示相反的内容:

publicclassReflectionExample{

    publicvoidcallPrivateMethod()throwsException{

        // Create a reference on the private method
        MethodmyPrivateMethod=MyClass.class.getDeclaredMethod("myPrivateMethod");

        // This make it possible to call a unaccessible method
        myPrivateMethod.setAccessible(true);

        // Create a new instance of my class
        MyClassmyClass=newMyClass();

        // Invoke the method here
        myPrivateMethod.invoke(myClass);

    }
}

瞧! 即时私有方法调用。 真正的能力在于第9行。它有效地告诉JVM忽略访问权限。 可怕的想法,不是吗? 好吧,事实并非如此:如果安全管理器拒绝它们的执行权,则以上所有代码行都将引发SecurityException 。 因此,代码永远不会在一个受保护的沙盒中运行(如Java Web Start的或小程序)。

这种策略的用途是无限的:

  • 去耦,
  • 控制权反转(Spring如何设法注入资源?),
  • 相对于测试的体系结构自由度(不再需要软件包可见性),
  • Web服务RPC,
  • 等等

还有其他想法吗?

翻译自: https://blog.frankel.ch/java-the-power-of-reflection/

java反射--内省

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值