1. 程式人生 > >獲取包下所有類中的註解的值 (java工具類)

獲取包下所有類中的註解的值 (java工具類)

作用:這個工具類主要的作用就是獲取類中的註解的值。
應用場景:做許可權的時候獲取@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(); } } } }