前几天项目中让扫描出所有使用Restful API的方法。刚开始还想着用python过滤关键字来查找的,后来想想可以使用反射来搞的。主要包含以下三个步骤:
- 根据包名解析包的具体路径
- 查找指定包下指定注解的类
- 在上一步骤中得到的类中,依次扫描包含指定注解的方法
想着写着工具类的形式,代码结构如下:
- public class AnnotationScannerUtils {
- private static final Logger logger = LoggerFactory.getLogger(AnnotationScannerUtils.class);
- private static final String EXT = "class
-
- /**
- * 根据包名获取包的URL
- * @param pkgName com.demo.controller
- * @return
- */
- public static String getPkgPath(String pkgName){
- String pkgDirName = pkgName.replace('.', File.separatorChar);
- URL url = Thread.currentThread().getContextClassLoader().getResource(pkgDirName);
- return url == null ? null : url.getFile();
- }
- /**
- * 获取指定包下所有类对象的集合
- * @param pkgName 包名(com.demo.controller)
- * @param pkgPath 包路径(/Users/xxx/workspace/java/project/out/production/classes/com/demo/controller)
- * @param recursive 是否递归遍历子目录
- * @return 类集合
- */
- public static Set<Class<?>> scanClasses(String pkgName, String pkgPath, final boolean recursive){
- Set<Class<?>> classesSet = new HashSet<>();
- Collection<File> allClassFile = getAllClassFile(pkgPath, recursive);
- for (File curFile : allClassFile){
- try {
- classesSet.add(getClassObj(curFile, pkgPath, pkgName));
- } catch (ClassNotFoundException e) {
- logger.error("load class fail", e);
- }
- }
- return classesSet;
- }
- /**
- * 获取指定包下包含指定注解的所有类对象的集合
- * @param pkgName 包名(com.demo.controller)
- * @param pkgPath 包路径(/Users/xxx/workspace/java/project/out/production/classes/com/demo/controller)
- * @param recursive 是否递归遍历子目录
- * @param targetAnnotations 指定注解
- *