最好使用反射或我的小黑客来访问私有方法?

时间:2013-08-28 19:12:27

标签: java inheritance reflection

我需要从另一个类访问私有方法。我有两种方法可以访问它。首先是明显的反思。第二种是黑客攻击。我需要调用的私有方法是从受保护的内部类的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罐子。

2 个答案:

答案 0 :(得分:1)

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

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

以下是Java's API concerning reflection的摘录:

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

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

同样地:

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

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

另一个考虑因素是,为了在没有实例化的情况下调用Hack类方法,需要将inner方法设置为static。

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

答案 1 :(得分:0)

这个问题上升的事实可能是由于糟糕的设计或Java不允许“子包”可见性这一事实造成的。但是,如果表现是一个问题,那就去寻找“小”黑客。否则,使用反射选择美学解决方案。但首先,试着找出你的设计是否合适。