一尘不染

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

java

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

通常,这些对象是外部对象的子字段,但有时我想即时生成它。我已经尝试过类似的方法,但无济于事。我相信这是因为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失败,则失败NoSuchMethodException。我可以通过制作方法来解决它public,或者制作另一个类来派生它。

长话短说,我只是想知道是否存在private一种通过反射访问方法的方法。


阅读 757

收藏
2020-03-08

共1个答案

一尘不染

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

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

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

2020-03-08