利用反射来自动生成简单的接口文档
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用反射来自动生成简单的接口文档相关的知识,希望对你有一定的参考价值。
一:简介
以前做项目提供接口时,每一个接口文档都是手写,手写接口文档有很多不足,比如:写接口文档比较消耗时间,参数首字母是小写,如果将参数直接复制到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(); "); sb.append("\\r\\n"); sb.append("int index=1;"); String msgArr[] = msg.split(","); for (String m : msgArr) { sb.append("params.put(\\"" + m + "\\", index);"); sb.append("\\r\\n"); sb.append("index++;"); sb.append("\\r\\n"); } sb.append( "HttpClientManager.getInstance().sendRequest(\\"" + URL + service + "/" + method + ".htm\\",params, networkBean);").append("\\r\\n"); sb.append("System.out.println(networkBean.getCode()+\\",\\"+networkBean.getResult()); "); sb.append("}"); log.info(sb.toString()); return sb; }
3:)程序自动生成的测试方法
public void query() { Map<String, Object> params = new HashMap<String, Object>(); NetworkBean networkBean = new NetworkBean(); int index = 1; params.put("status", index); index++; HttpClientManager.getInstance().sendRequest( "http://127.0.0.1:8080/publicsh//user/query.htm", params, networkBean); System.out.println(networkBean.getCode() + "," + networkBean.getResult()); } public void save() { Map<String, Object> params = new HashMap<String, Object>(); NetworkBean networkBean = new NetworkBean(); int index = 1; params.put("name", index); index++; params.put("passWord", index); index++; params.put("paramsStatus", index); index++; params.put("age", index); index++; HttpClientManager.getInstance().sendRequest( "http://127.0.0.1:8080/publicsh//user/save.htm", params, networkBean); System.out.println(networkBean.getCode() + "," + networkBean.getResult()); }
以上是关于利用反射来自动生成简单的接口文档的主要内容,如果未能解决你的问题,请参考以下文章