@big-bear
2018-01-11T09:03:04.000000Z
字数 1053
阅读 858
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;}
