一:简介
以前做项目提供接口时,每一个接口文档都是手写,手写接口文档有很多不足,比如:写接口文档比较消耗时间,参数首字母是小写,如果将参数直接复制到word文档,第一个字母有时候是大写,或者复制参数时,有些参数忘记复制等,把有问题的文档发给前端的同事,他们也会非常抱怨,这样团队的气氛也不好,所以后来渐渐发觉,其实这些工作可以利用java的反射来帮我们完成,我们只需要写一些参数描述,就能生成接口文档,另外接口的测试方法也可以利用反射来完成,这样可以有效的提高工作效率。
效果图如下:
//程序生成的word,没有样式,你可以手动设置样式
//控制层图片
二:代码
1)利用反射来获取某个controller下的某个方法,以及该方法的参数,参数类型。
//接口测试的map
Map<String, StringBuilder> serviceTestMap = new HashMap<String, StringBuilder>();
//接口所有的参数Map<参数key, 参数类型>
Map<String, Object> methodParams = new LinkedHashMap<String, Object>();
try {
Class clazz = Class.forName(className);
ClassPool pool = ClassPool.getDefault();
List paramsType = new ArrayList();
CtClass cc = pool.get(clazz.getName());
Method method[] = clazz.getDeclaredMethods();
for (Method m : method) {
String methodName = m.getName();
if (!methodMap.containsKey(methodName)) {
continue;
}
paramsType = new ArrayList();
Class[] cParams = m.getParameterTypes();
for (Class cType : cParams) {
//此处的包是,我们系统封装后的包名,你可以注释这些代码
if (cType.getName().equals("im.core.mvc.controller.IModel")
|| cType.getName().equals("im.core.dao.Dao")|| cType.getName().equals("lj.sys.UserToken")) {
continue;
}
paramsType.add(cType.getName());
}
index = 0;
CtMethod cm = cc.getDeclaredMethod(methodName);
MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute
.getAttribute(LocalVariableAttribute.tag);
if (attr == null) {
// exception
}
String[] paramNames = new String[cm.getParameterTypes().length];
int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;
for (int i = 0; i < paramNames.length; i++)
paramNames[i] = attr.variableName(i + pos);
for (int i = 0; i < paramNames.length; i++) {
String paramName = paramNames[i];
if (paramName.equals("model") || paramName.equals("dao")|| paramName.equals("userToken")) {
if(paramName.equals("dao")){
methodParams.put("paramsStatus",1);
}
continue;
}
methodParams.put(paramNames[i], paramsType.get(index)
.toString());
if (serviceTestMap.containsKey(methodName)) {
serviceTestMap.get(methodName).append(
paramNames[i] + ",");
} else {
sb = new StringBuilder();
sb.append(paramNames[i] + ",");
serviceTestMap.put(methodName, sb);
}
index++;
}
params.put(methodName, methodParams);
methodParams = new LinkedHashMap<String, Object>();
}
Iterator iterator = serviceTestMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Entry) iterator.next();
createRequest(service, entry.getValue().toString(), entry
.getKey().toString(), 0);
}
2:)自动生成接口测试的方法
public StringBuffer createRequest(String service, String msg,
String method, int type) {
StringBuffer sb = new StringBuffer("public void " + method + "(){")
.append("\r\n");
sb.append("Map<String, Object> params = new HashMap<String, Object>();");
sb.append("\r\n");
sb.append("NetworkBean networkBean = new NetworkBean(); ");