利用反射来自动生成简单的接口文档

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());
    }

 

代码完整下载地址:github







以上是关于利用反射来自动生成简单的接口文档的主要内容,如果未能解决你的问题,请参考以下文章

利用Java反射机制实现对象相同字段的复制

简单实现动态代理(Proxy)

利用注解 + 反射消除重复代码,妙!

利用注解 + 反射消除重复代码,妙!

利用注解 + 反射消除重复代码,妙!

利用注解 + 反射消除重复代码,妙!