任何方式来调用私有方法?

我有一个类使用XML和reflection来返回Object到另一个类。

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

 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这个方法来解决这个问题,或者让另一个类从中派生出来。

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

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

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

有几个警告。 首先, getDeclaredMethod只能find当前Class声明的方法,不能从超Classinheritance。 所以,如有必要,遍历具体的类层次结构。 其次, SecurityManager可以防止使用setAccessible方法。 所以,它可能需要作为PrivilegedAction运行(使用AccessControllerSubject )。

使用getDeclaredMethod()获取一个私有的Method对象,然后使用method.setAccessible()来允许实际调用它。

如果该方法接受非基元数据types,则可以使用以下方法来调用任何类的私有方法:

 public static Object genericInvokMethod(Object obj, String methodName, int paramCount, Object... params) { Method method; Object requiredObj = null; Object[] parameters = new Object[paramCount]; Class<?>[] classArray = new Class<?>[paramCount]; for (int i = 0; i < paramCount; i++) { parameters[i] = params[i]; classArray[i] = params[i].getClass(); } try { method = obj.getClass().getDeclaredMethod(methodName, classArray); method.setAccessible(true); requiredObj = method.invoke(obj, params); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return requiredObj; } 

接受的参数是obj,methodName,接受的参数数量和参数。 例如

 public class Test { private String concatString(String a, String b) { return (a+b); } } 

方法concatString可以被调用为

 Test t = new Test(); String str = (String) genericInvokMethod(t, "concatString", 2, "Hello", "Mr.x");