![](/img/trans.png)
[英]Is it good to use reflection API on access of private method and variable?
[英]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的摘录:
2)反思会导致安全问题吗? (SecurityManager有时会拒绝setAccessible吗?)这需要一直在任何计算机/设置上工作。
同样:
因此,不仅可以拒绝setAccessible方法,还可以拒绝整个反射用法。
另一个考虑因素是,为了不实例化地调用Hack类方法,您需要将内部方法设置为静态方法。
class Hack extends ProtectedInnerClass {
public static void accessPrivateMethod() {
super.callPrivateMethod();
}
}
Hack.accessPrivateMethod();
出现此问题的事实可能是由于设计不良或Java不允许“子包”可见性这一事实引起的。 但是,如果要考虑性能,请尝试“小”技巧。 否则,请使用反射选择美学解决方案。 但是首先,请尝试确定您的设计是否良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.