【发布时间】:2013-08-28 19:12:26
【问题描述】:
我需要从另一个类访问私有方法。我有两种访问方式。首先是明显的反映。第二个是一种黑客攻击。我需要调用的私有方法是从受保护的内部类的 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。
【问题讨论】:
-
这是糟糕设计的标志。
-
如果你需要使用另一个类的
private方法,那么它必须不是private,而是protected或public。假设此方法来自第三方库,您无法更改代码但您可以访问代码,我建议将此代码移动到实用程序类并从那里使用它。跨度> -
如果该方法在另一个类中是私有的,则您不应该访问它。如果必须这样做,那你的设计就很糟糕。
-
顺便说一句,你不能从子类访问任何
private字段或方法,甚至不能使用super关键字,所以你的 hack 不起作用. -
我需要访问的私有方法在 JUNG 库中。调用它修复了一个错误。 AKA 我正在尝试找到一种解决方法,而无需编辑任何 JUNG jar。
标签: java inheritance reflection