繁体   English   中英

更好地使用反射或我的小技巧来访问私有方法?

[英]Better to use reflection or my little hack to access a private method?

我需要从另一个类访问私有方法。 我有两种访问方法。 首先是明显的反思。 第二种是骇客。 我需要调用的私有方法是从受保护的内部类的accessPrivateMethod方法中调用的。 实际上,此方法只会调用我需要的私有方法。 因此,最好是使用反射来访问它,还是最好通过扩展受保护的调用它的内部类来“破解”它。 看到代码:

method = object.getClass().getDeclaredMethod("privateMethod");
method.setAccessible(true);
Object r = method.invoke(object);

或:(ProtectedInnerClass是我要访问其私有方法的类中的一个受保护的内部类。)

class Hack extends ProtectedInnerClass {
    public void accessPrivateMethod() {
        // callPrivateMethod literally only calls the private method
        // I need to call.
        super.callPrivateMethod();
    }
}
...
Hack.accessPrivateMethod();

一些其他想法:

1)我已经看到很多人在这里说仅将反射作为最后的手段。

2)反思会导致安全问题吗? (SecurityManager有时会拒绝setAccessible吗?)这需要一直在任何计算机/设置上工作。

如果不清楚,请这样说,我将尝试详细说明。 谢谢!

PS:我需要访问的私有方法在JUNG库中。 调用它可以修复错误。 我又想找到一种解决方法,而无需编辑任何JUNG罐子。

1)我已经看到很多人在这里说仅将反射作为最后的手段。

假设您的hack确实有效,那么最好使用它,而不是使用反射。 这是因为使用反射会更昂贵。

这是有关反射的Java API的摘录:

  • 由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。 因此,反射操作的性能要比非反射操作慢,因此应该避免在对性能敏感的应用程序中经常调用的代码段中。

2)反思会导致安全问题吗? (SecurityManager有时会拒绝setAccessible吗?)这需要一直在任何计算机/设置上工作。

同样:

  • 反射需要运行时许可,而在安全管理器下运行时可能不存在。 对于必须在受限的安全上下文(例如Applet)中运行的代码,这是一个重要的考虑因素。

因此,不仅可以拒绝setAccessible方法,还可以拒绝整个反射用法。

另一个考虑因素是,为了不实例化地调用Hack类方法,您需要将内部方法设置为静态方法。

class Hack extends ProtectedInnerClass {
   public static void accessPrivateMethod() {
       super.callPrivateMethod();
   }
}
Hack.accessPrivateMethod();

出现此问题的事实可能是由于设计不良或Java不允许“子包”可见性这一事实引起的。 但是,如果要考虑性能,请尝试“小”技巧。 否则,请使用反射选择美学解决方案。 但是首先,请尝试确定您的设计是否良好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM