前几天项目中让扫描出所有使用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 指定注解
*