利用Java反射机制模拟Swagger管理接口

本文详细介绍了如何借助Java的反射机制来模拟Swagger的功能,实现API接口的管理和文档化。通过反射,我们可以动态获取类的方法和属性信息,进而构建接口的元数据,展示出类似于Swagger的接口文档。这种方法对于快速构建RESTful API文档非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * by hxy on 2019/2/26.
 * 自定义方法、参数描述的注解
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface DescAnnotation {
  String desc();
}
/**
 * by hxy on 2019/2/26.
 * 管理员方法参数类
 */
public class AdminTaskParam {
  private String code;  //变量名
//  private String name;
  private String type;  //类型
  private String desc;  //描述
}
/**
   * 获取管理员功能列表
   */
  private List<AdminTask> getAllList(Class clazz) {
    RequestMapping annotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class);
    String classUrl = annotation.value()[0];

    Method[] methods = clazz.getDeclaredMethods();
    List<AdminTask> taskList = new ArrayList<>();

    LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
    AdminTask methodTask = null;

    for (Method m : methods) {

      //有@RequestMapping和@ResponseBody的方法
      if (m.isAnnotationPresent(RequestMapping.class) && m.isAnnotationPresent(ResponseBody.class)) {
        methodTask = new AdminTask();

        //获取方法描述
        if (m.isAnnotationPresent(DescAnnotation.class)) {
          String desc = m.getAnnotation(DescAnnotation.class).desc();
          methodTask.setDesc(StringUtil.isBlank(desc) ? m.getName() : desc);
        } else {
          methodTask.setDesc(m.getName());
        }

        String methodUrl = m.getAnnotation(RequestMapping.class).value()[0];
        methodTask.setUrl((classUrl.startsWith("/") ? "" : "/") + classUrl + (methodUrl.startsWith("/") ? "" : "/") + methodUrl);
        methodTask.setCode(m.getName());

        int pCount = m.getParameterCount();
        if (pCount > 0) {
          List<AdminTaskParam> paramList = new ArrayList<>(pCount);

          Class<?>[] paramTypes = m.getParameterTypes();
          String[] params = u.getParameterNames(m);

          //获取参数描述
          List<String> pDescs = new ArrayList<>(pCount);
          Annotation[][] paramAnnos = m.getParameterAnnotations();
          for (Annotation[] annotations : paramAnnos) {
            //如果方法有添加@DescAnnotation
            if (CollectionUtils.arrayToList(annotations).contains(DescAnnotation.class)) {
              for (Annotation anno : annotations) {
                if (anno instanceof DescAnnotation) {
                  DescAnnotation da = (DescAnnotation) anno;
                  pDescs.add(da.desc());
                }
              }
            } else {
              pDescs.add("");
            }
          }
          //参数列表
          for (int i = 0; i < pDescs.size(); i++) {
            AdminTaskParam param = new AdminTaskParam();
            param.setCode(params[i]);
            param.setType(paramTypes[i].getName());
            param.setDesc(StringUtil.isBlank(pDescs.get(i)) ? params[i] : pDescs.get(i));
            paramList.add(param);
          }
          methodTask.setParams(paramList);
        }
        taskList.add(methodTask);
      }
    }
    return taskList;
  }
/**
   * @param cls    要添加到管理任务的Controller的@RequestMapping映射
   * @param method 方法名
   * @return
   */
  @RequestMapping("/adminList")
  public ModelAndView getAdminTaskList(@RequestParam(required = false) String cls, @RequestParam(required = false) String method) {
    List<AdminTask> methodList = getAllList(getClassByCode(cls));

    ModelAndView mav = new ModelAndView();
    mav.setViewName("admin/adminList");
    mav.addObject("taskList", methodList);
    mav.addObject("cls", cls);
    mav.addObject("adminConsoleUrl", this.getConsoleUrl());

    if (StringUtil.isNotBlank(method)) {
      for (AdminTask task : methodList) {
        if (method.equals(task.getCode())) {
          mav.addObject("methodInfo", task);
          break;
        }
      }
    }
    return mav;
  }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值