有什么方法可以调用私有方法吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (93)

我有一个使用XML和反射来返回Object另一个类的类。

通常情况下,这些对象是外部对象的子字段,但偶尔也是我想要即时生成的。我试过这样的东西,但无济于事。我相信那是因为Java不允许你访问private反射的方法。

Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");

if ("SomeObject".equals(objectName))
    object = someObject;
else
    object = this;

method = object.getClass().getMethod(methodName, (Class[]) null);

如果提供的方法是private,它会失败并显示a NoSuchMethodException。我可以通过制作方法来解决这个问题public,或者通过创建另一个类来获得它。

长话短说,我只是想知道是否有private方法通过反射来访问方法。

提问于
用户回答回答于

你可以用反射来调用私有方法。修改发布代码的最后一位:

Method method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
Object r = method.invoke(object);

有几个警告。首先,getDeclaredMethod只会查找当前声明的方法Class,而不是从超类型继承。因此,如有必要,遍历具体的类层次结构。其次,SecurityManager可以防止使用该setAccessible方法。所以,它可能需要运行PrivilegedAction(使用AccessControllerSubject)。

用户回答回答于

使用getDeclaredMethod()获得的私有方法的对象,然后使用method.setAccessible()允许实际调用它。

扫码关注云+社区