任何方式来调用私有方法?
我有一个类使用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
声明的方法,不能从超Class
inheritance。 所以,如有必要,遍历具体的类层次结构。 其次, SecurityManager
可以防止使用setAccessible
方法。 所以,它可能需要作为PrivilegedAction
运行(使用AccessController
或Subject
)。
使用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");