猿问

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

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

我有一个使用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通过反射访问方法。


呼啦一阵风
浏览 1236回答 3
3回答

白衣非少年

您可以使用反射调用私有方法。修改已发布代码的最后一位:Method method = object.getClass().getDeclaredMethod(methodName);method.setAccessible(true);Object r = method.invoke(object);有几点需要注意。首先,getDeclaredMethod只会查找当前声明的方法Class,而不是从超类型继承。因此,如有必要,遍历具体的类层次结构。其次,a SecurityManager可以防止使用该setAccessible方法。因此,它可能需要作为PrivilegedAction(使用AccessController或Subject)运行。

潇湘沐

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

吃鸡游戏

如果方法接受非原始数据类型,则可以使用以下方法来调用任何类的私有方法:public&nbsp;static&nbsp;Object&nbsp;genericInvokeMethod(Object&nbsp;obj,&nbsp;String&nbsp;methodName, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object...&nbsp;params)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;paramCount&nbsp;=&nbsp;params.length; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;method; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;requiredObj&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class<?>[]&nbsp;classArray&nbsp;=&nbsp;new&nbsp;Class<?>[paramCount]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;paramCount;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classArray[i]&nbsp;=&nbsp;params[i].getClass(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;=&nbsp;obj.getClass().getDeclaredMethod(methodName,&nbsp;classArray); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method.setAccessible(true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requiredObj&nbsp;=&nbsp;method.invoke(obj,&nbsp;params); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NoSuchMethodException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InvocationTargetException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;requiredObj; &nbsp;&nbsp;&nbsp;&nbsp;}接受的参数是obj,methodName和参数。例如public&nbsp;class&nbsp;Test&nbsp;{private&nbsp;String&nbsp;concatString(String&nbsp;a,&nbsp;String&nbsp;b)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(a+b);}}方法concatString可以作为调用Test&nbsp;t&nbsp;=&nbsp;new&nbsp;Test(); &nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;(String)&nbsp;genericInvokeMethod(t,&nbsp;"concatString",&nbsp;"Hello",&nbsp;"Mr.x");
随时随地看视频慕课网APP

相关分类

Java
我要回答