@big-bear
2018-01-11T09:03:04.000000Z
字数 1053
阅读 791
Java
日常code的时候,当你需要处理复杂业务逻辑的时候,经常会为了是代码结构清楚将部分代码抽成一个私有方法,有时候需要单元测试一下私有方法.java的发射机制提供了给我们测试类的私有方法的途径.
/**
* 执行类的私有方法
* @param obj 调用方法的对象
* @param clazz 私有方法所在的类
* @param methodName 私有方法名
* @param classes 参数类型数组
* @param objects 参数数组
* @return 方法的返回值
*/
public Object invoke(final Object obj,final Class clazz, final String methodName,
final Class[] classes, final Object[] objects) {
try {
Method method = getMethod(clazz, methodName, classes);
method.setAccessible(true);// 调用private方法的关键一句话
return method.invoke(obj, objects);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。
*
* @param clazz
* 目标类
* @param methodName
* 方法名
* @param classes
* 方法参数类型数组
* @return 方法对象
* @throws Exception
*/
private Method getMethod(Class clazz, String methodName,
final Class[] classes) {
Method method = null;
try {
method = clazz.getDeclaredMethod(methodName, classes);
} catch (NoSuchMethodException e) {
try {
method = clazz.getMethod(methodName, classes);
} catch (NoSuchMethodException ex) {
if (clazz.getSuperclass() == null) {
return method;
} else {
method = getMethod(clazz.getSuperclass(), methodName,
classes);
}
}
}
return method;
}