有个小需求是扫描在SpringBoot 注册的RequestMapping接口地址,可以先扫描所有使用Controller注解的类,然后获取他们的方法,判断使用的RequestMapping注解,再获取value,就能拿到接口地址了。下面为代码片段
/** * 扫描使用注解的类 * @param packageName 扫描包名 * @param annotation 注解类 * @return 扫描到的集合 */ public static List<class> scanClass(String packageName, Class annotation) { List<class> classList = new ArrayList<>(); if (ObjectUtils.isEmpty(packageName)) { return classList; } ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); TypeFilter includeFilter = (metadataReader, metadataReaderFactory) -> true; provider.addIncludeFilter(includeFilter); Set<beandefinition> beanDefinitionSet = new HashSet<>(); // 指定扫描的包名 Set<beandefinition> candidateComponents = provider.findCandidateComponents(packageName); beanDefinitionSet.addAll(candidateComponents); beanDefinitionSet.forEach(beanDefinition -> { try { Class clazz = Class.forName(beanDefinition.getBeanClassName()); if (!ObjectUtils.isEmpty(annotation)) { if (!ObjectUtils.isEmpty(AnnotationUtils.getAnnotation(clazz, annotation))) { classList.add(clazz); } } else { classList.add(clazz); } } catch (ClassNotFoundException e) { e.printStackTrace(); } // System.out.println(definition.getBeanClassName()); }); return classList; } /** * 获取Url * @param packageName 扫描包名 * @param className 指定类,如无指定类,为null即可 * @return url集合 */ public static List<string> getUrls(String packageName,String className){ List<class> list= scanClass(packageName, Controller.class); List<string> urls=new ArrayList<>(); for (Class aClass : list) { if(className!=null&&!aClass.getSimpleName().equals(className)){ continue; } Method[] methods= aClass.getDeclaredMethods(); for (Method method : methods) { RequestMapping ls=method.getAnnotation(RequestMapping.class); if(ls!=null) { urls.add(ls.value()[0]); } } } return urls; }