我需要从另一个类访问私有方法。我有两种方法可以访问它。首先是明显的反思。第二种是黑客攻击。我需要调用的私有方法是从受保护的内部类的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库中。调用它修复了一个错误。 AKA我试图找到一个解决方法而无需编辑任何JUNG罐子。
答案 0 :(得分:1)
1)我看到很多人在这里说只使用反射作为最后的手段。
假设你的 hack 实际上有效,最好使用它,而不是使用反射。这是因为使用反射更加昂贵。
以下是Java's API concerning reflection的摘录:
2)反思可能导致安全问题? (SecurityManager有时可以拒绝setAccessible吗?)这需要在任何机器/设置上一直工作。
同样地:
因此,不仅可以拒绝setAccessible方法,还可以拒绝整体反射使用。
另一个考虑因素是,为了在没有实例化的情况下调用Hack类方法,需要将inner方法设置为static。
class Hack extends ProtectedInnerClass {
public static void accessPrivateMethod() {
super.callPrivateMethod();
}
}
Hack.accessPrivateMethod();
答案 1 :(得分:0)
这个问题上升的事实可能是由于糟糕的设计或Java不允许“子包”可见性这一事实造成的。但是,如果表现是一个问题,那就去寻找“小”黑客。否则,使用反射选择美学解决方案。但首先,试着找出你的设计是否合适。