1

我需要从另一个类访问私有方法。我有两种访问方式。首先是明显的反映。第二个是一种黑客攻击。我需要调用的私有方法是从受保护的内部类的 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?)这需要在任何机器/设置上一直有效。

如果我的 hack 不清楚,请说出来,我会尝试详细说明。谢谢!

PS:我需要访问的私有方法在 JUNG 库中。调用它修复了一个错误。AKA 我正在尝试找到一种解决方法,而无需编辑任何 JUNG jar。

4

2 回答 2

2

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

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

下面是关于反射的 Java API的摘录:

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

2)反射可能会导致安全问题?(SecurityManager 有时可以拒绝 setAccessible?)这需要在任何机器/设置上一直有效。

同样地:

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

因此,不仅 setAccessible 方法可能会被拒绝,而且整个反射使用也会被拒绝。

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

class Hack extends ProtectedInnerClass {
   public static void accessPrivateMethod() {
       super.callPrivateMethod();
   }
}
Hack.accessPrivateMethod();
于 2013-08-28T20:00:39.733 回答
0

The fact that this question rises is probably caused by bad design or the fact that Java doesn't allow "sub-package" visibility. However, if performance is a concern, go for the "little" hack. Otherwise, choose the esthetic solution using reflections. But in first place, try to find out if your design is good.

于 2013-08-28T19:17:24.890 回答