獲取包下所有類中的註解的值 (java工具類)
阿新 • • 發佈:2019-02-03
作用:這個工具類主要的作用就是獲取類中的註解的值。
應用場景:做許可權的時候獲取@RequestMapping();的值,自動新增到資料庫中。
/**
* getRequestMappingValue方法描述:
* 作者:thh
* 日期:2016年7月18日 下午5:41:00
* 異常物件:@param packageName
* 異常物件:@return
*/
public static List<String> getRequestMappingValue(String packageName) {
GetAnnotationValueUtil getAnnotationValueUtil = new GetAnnotationValueUtil();
//第一個class類的集合
List<Class<?>> classes = new ArrayList<Class<?>>();
//是否迴圈迭代
boolean recursive = true;
//獲取包的名字 並進行替換
String packageDirName = packageName.replace('.', '/');
//定義一個列舉的集合 並進行迴圈來處理這個目錄下的檔案
Enumeration<URL> dirs;
try {
//讀取指定package下的所有class
dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
while (dirs.hasMoreElements()){
URL url = dirs.nextElement();
//得到協議的名稱
String protocol = url.getProtocol();
//判斷是否以檔案的形式儲存在伺服器上
if ("file".equals(protocol)) {
//獲取包的物理路徑
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
//以檔案的方式掃描整個包下的檔案 並新增到集合中
findAndAddClassesInPackageByFile(packageName, filePath, recursive, classes);
}
}
} catch (IOException e) {
e.printStackTrace();
}
List<String> stringList = new ArrayList<String>();
for (Class<?> clazz : classes) {
//迴圈獲取所有的類
Class<?> c = clazz;
//獲取類的所有方法
Method[] methods = c.getMethods();
for (Method method : methods) {
//獲取RequestMapping註解
RequestMapping annotation = method.getAnnotation(RequestMapping.class);
if (annotation != null) {
//獲取註解的value值
String[] value = annotation.value();
for (String string : value) {
//放入List集合
stringList.add(string);
}
}
}
}
return stringList;
}
/**
* findAndAddClassesInPackageByFile方法描述:
* 作者:thh
* 日期:2016年7月18日 下午5:41:12
* 異常物件:@param packageName
* 異常物件:@param packagePath
* 異常物件:@param recursive
* 異常物件:@param classes
*/
public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, List<Class<?>> classes){
//獲取此包的目錄 建立一個File
File dir = new File(packagePath);
//如果不存在或者 也不是目錄就直接返回
if (!dir.exists() || !dir.isDirectory()) {
return;
}
//如果存在 就獲取包下的所有檔案 包括目錄
File[] dirfiles = dir.listFiles(new FileFilter() {
//自定義過濾規則 如果可以迴圈(包含子目錄) 或則是以.class結尾的檔案(編譯好的java類檔案)
public boolean accept(File file) {
return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
}
});
//迴圈所有檔案
for (File file : dirfiles) {
//如果是目錄 則繼續掃描
if (file.isDirectory()) {
findAndAddClassesInPackageByFile(packageName + "." + file.getName(),
file.getAbsolutePath(),
recursive,
classes);
}
else {
//如果是java類檔案 去掉後面的.class 只留下類名
String className = file.getName().substring(0, file.getName().length() - 6);
try {
//新增到集合中去
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}