>getClasses(Stringpack){//第一" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

java讀取指定package下的所有class

系統(tǒng) 2500 0

?????? 之前在看spring注解的時(shí)候,有看到再配置文件里面定義component scan package就能自動掃描對應(yīng)包下面的class,

然后根據(jù)注解生成相應(yīng)的bean。自己對這個(gè)功能很好奇,就搜了下,找到了實(shí)現(xiàn)的關(guān)鍵代碼,記錄下。后續(xù)再對這段代碼深入學(xué)習(xí)。

?

?

Java代碼 復(fù)制代碼 ? 收藏代碼
  1. /** ?
  2. ?????*?從包package中獲取所有的Class ?
  3. ?????*? ?
  4. ?????*?@param?pack ?
  5. ?????*?@return ?
  6. ?????*/ ??
  7. ???? public ? static ?Set<Class<?>>?getClasses(String?pack)?{ ??
  8. ??
  9. ???????? //?第一個(gè)class類的集合 ??
  10. ????????Set<Class<?>>?classes?=? new ?LinkedHashSet<Class<?>>(); ??
  11. ???????? //?是否循環(huán)迭代 ??
  12. ???????? boolean ?recursive?=? true ; ??
  13. ???????? //?獲取包的名字?并進(jìn)行替換 ??
  14. ????????String?packageName?=?pack; ??
  15. ????????String?packageDirName?=?packageName.replace( '.' ,? '/' ); ??
  16. ???????? //?定義一個(gè)枚舉的集合?并進(jìn)行循環(huán)來處理這個(gè)目錄下的things ??
  17. ????????Enumeration<URL>?dirs; ??
  18. ???????? try ?{ ??
  19. ????????????dirs?=?Thread.currentThread().getContextClassLoader().getResources( ??
  20. ????????????????????packageDirName); ??
  21. ???????????? //?循環(huán)迭代下去 ??
  22. ???????????? while ?(dirs.hasMoreElements())?{ ??
  23. ???????????????? //?獲取下一個(gè)元素 ??
  24. ????????????????URL?url?=?dirs.nextElement(); ??
  25. ???????????????? //?得到協(xié)議的名稱 ??
  26. ????????????????String?protocol?=?url.getProtocol(); ??
  27. ???????????????? //?如果是以文件的形式保存在服務(wù)器上 ??
  28. ???????????????? if ?( "file" .equals(protocol))?{ ??
  29. ????????????????????System.err.println( "file類型的掃描" ); ??
  30. ???????????????????? //?獲取包的物理路徑 ??
  31. ????????????????????String?filePath?=?URLDecoder.decode(url.getFile(),? "UTF-8" ); ??
  32. ???????????????????? //?以文件的方式掃描整個(gè)包下的文件?并添加到集合中 ??
  33. ????????????????????findAndAddClassesInPackageByFile(packageName,?filePath, ??
  34. ????????????????????????????recursive,?classes); ??
  35. ????????????????}? else ? if ?( "jar" .equals(protocol))?{ ??
  36. ???????????????????? //?如果是jar包文件 ??
  37. ???????????????????? //?定義一個(gè)JarFile ??
  38. ????????????????????System.err.println( "jar類型的掃描" ); ??
  39. ????????????????????JarFile?jar; ??
  40. ???????????????????? try ?{ ??
  41. ???????????????????????? //?獲取jar ??
  42. ????????????????????????jar?=?((JarURLConnection)?url.openConnection()) ??
  43. ????????????????????????????????.getJarFile(); ??
  44. ???????????????????????? //?從此jar包?得到一個(gè)枚舉類 ??
  45. ????????????????????????Enumeration<JarEntry>?entries?=?jar.entries(); ??
  46. ???????????????????????? //?同樣的進(jìn)行循環(huán)迭代 ??
  47. ???????????????????????? while ?(entries.hasMoreElements())?{ ??
  48. ???????????????????????????? //?獲取jar里的一個(gè)實(shí)體?可以是目錄?和一些jar包里的其他文件?如META-INF等文件 ??
  49. ????????????????????????????JarEntry?entry?=?entries.nextElement(); ??
  50. ????????????????????????????String?name?=?entry.getName(); ??
  51. ???????????????????????????? //?如果是以/開頭的 ??
  52. ???????????????????????????? if ?(name.charAt( 0 )?==? '/' )?{ ??
  53. ???????????????????????????????? //?獲取后面的字符串 ??
  54. ????????????????????????????????name?=?name.substring( 1 ); ??
  55. ????????????????????????????} ??
  56. ???????????????????????????? //?如果前半部分和定義的包名相同 ??
  57. ???????????????????????????? if ?(name.startsWith(packageDirName))?{ ??
  58. ???????????????????????????????? int ?idx?=?name.lastIndexOf( '/' ); ??
  59. ???????????????????????????????? //?如果以"/"結(jié)尾?是一個(gè)包 ??
  60. ???????????????????????????????? if ?(idx?!=?- 1 )?{ ??
  61. ???????????????????????????????????? //?獲取包名?把"/"替換成"." ??
  62. ????????????????????????????????????packageName?=?name.substring( 0 ,?idx) ??
  63. ????????????????????????????????????????????.replace( '/' ,? '.' ); ??
  64. ????????????????????????????????} ??
  65. ???????????????????????????????? //?如果可以迭代下去?并且是一個(gè)包 ??
  66. ???????????????????????????????? if ?((idx?!=?- 1 )?||?recursive)?{ ??
  67. ???????????????????????????????????? //?如果是一個(gè).class文件?而且不是目錄 ??
  68. ???????????????????????????????????? if ?(name.endsWith( ".class" ) ??
  69. ????????????????????????????????????????????&&?!entry.isDirectory())?{ ??
  70. ???????????????????????????????????????? //?去掉后面的".class"?獲取真正的類名 ??
  71. ????????????????????????????????????????String?className?=?name.substring( ??
  72. ????????????????????????????????????????????????packageName.length()?+? 1 ,?name ??
  73. ????????????????????????????????????????????????????????.length()?-? 6 ); ??
  74. ???????????????????????????????????????? try ?{ ??
  75. ???????????????????????????????????????????? //?添加到classes ??
  76. ????????????????????????????????????????????classes.add(Class ??
  77. ????????????????????????????????????????????????????.forName(packageName?+? '.' ??
  78. ????????????????????????????????????????????????????????????+?className)); ??
  79. ????????????????????????????????????????}? catch ?(ClassNotFoundException?e)?{ ??
  80. ???????????????????????????????????????????? //?log ??
  81. ???????????????????????????????????????????? //?.error("添加用戶自定義視圖類錯(cuò)誤?找不到此類的.class文件"); ??
  82. ????????????????????????????????????????????e.printStackTrace(); ??
  83. ????????????????????????????????????????} ??
  84. ????????????????????????????????????} ??
  85. ????????????????????????????????} ??
  86. ????????????????????????????} ??
  87. ????????????????????????} ??
  88. ????????????????????}? catch ?(IOException?e)?{ ??
  89. ???????????????????????? //?log.error("在掃描用戶定義視圖時(shí)從jar包獲取文件出錯(cuò)"); ??
  90. ????????????????????????e.printStackTrace(); ??
  91. ????????????????????} ??
  92. ????????????????} ??
  93. ????????????} ??
  94. ????????}? catch ?(IOException?e)?{ ??
  95. ????????????e.printStackTrace(); ??
  96. ????????} ??
  97. ??
  98. ???????? return ?classes; ??
  99. ????}??
      /**
	 * 從包package中獲取所有的Class
	 * 
	 * @param pack
	 * @return
	 */
	public static Set<Class<?>> getClasses(String pack) {

		// 第一個(gè)class類的集合
		Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
		// 是否循環(huán)迭代
		boolean recursive = true;
		// 獲取包的名字 并進(jìn)行替換
		String packageName = pack;
		String packageDirName = packageName.replace('.', '/');
		// 定義一個(gè)枚舉的集合 并進(jìn)行循環(huán)來處理這個(gè)目錄下的things
		Enumeration<URL> dirs;
		try {
			dirs = Thread.currentThread().getContextClassLoader().getResources(
					packageDirName);
			// 循環(huán)迭代下去
			while (dirs.hasMoreElements()) {
				// 獲取下一個(gè)元素
				URL url = dirs.nextElement();
				// 得到協(xié)議的名稱
				String protocol = url.getProtocol();
				// 如果是以文件的形式保存在服務(wù)器上
				if ("file".equals(protocol)) {
					System.err.println("file類型的掃描");
					// 獲取包的物理路徑
					String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
					// 以文件的方式掃描整個(gè)包下的文件 并添加到集合中
					findAndAddClassesInPackageByFile(packageName, filePath,
							recursive, classes);
				} else if ("jar".equals(protocol)) {
					// 如果是jar包文件
					// 定義一個(gè)JarFile
					System.err.println("jar類型的掃描");
					JarFile jar;
					try {
						// 獲取jar
						jar = ((JarURLConnection) url.openConnection())
								.getJarFile();
						// 從此jar包 得到一個(gè)枚舉類
						Enumeration<JarEntry> entries = jar.entries();
						// 同樣的進(jìn)行循環(huán)迭代
						while (entries.hasMoreElements()) {
							// 獲取jar里的一個(gè)實(shí)體 可以是目錄 和一些jar包里的其他文件 如META-INF等文件
							JarEntry entry = entries.nextElement();
							String name = entry.getName();
							// 如果是以/開頭的
							if (name.charAt(0) == '/') {
								// 獲取后面的字符串
								name = name.substring(1);
							}
							// 如果前半部分和定義的包名相同
							if (name.startsWith(packageDirName)) {
								int idx = name.lastIndexOf('/');
								// 如果以"/"結(jié)尾 是一個(gè)包
								if (idx != -1) {
									// 獲取包名 把"/"替換成"."
									packageName = name.substring(0, idx)
											.replace('/', '.');
								}
								// 如果可以迭代下去 并且是一個(gè)包
								if ((idx != -1) || recursive) {
									// 如果是一個(gè).class文件 而且不是目錄
									if (name.endsWith(".class")
											&& !entry.isDirectory()) {
										// 去掉后面的".class" 獲取真正的類名
										String className = name.substring(
												packageName.length() + 1, name
														.length() - 6);
										try {
											// 添加到classes
											classes.add(Class
													.forName(packageName + '.'
															+ className));
										} catch (ClassNotFoundException e) {
											// log
											// .error("添加用戶自定義視圖類錯(cuò)誤 找不到此類的.class文件");
											e.printStackTrace();
										}
									}
								}
							}
						}
					} catch (IOException e) {
						// log.error("在掃描用戶定義視圖時(shí)從jar包獲取文件出錯(cuò)");
						e.printStackTrace();
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		return classes;
	}
    
?

?

Java代碼 復(fù)制代碼 ? 收藏代碼
  1. /** ?
  2. ?????*?以文件的形式來獲取包下的所有Class ?
  3. ?????*? ?
  4. ?????*?@param?packageName ?
  5. ?????*?@param?packagePath ?
  6. ?????*?@param?recursive ?
  7. ?????*?@param?classes ?
  8. ?????*/ ??
  9. ???? public ? static ? void ?findAndAddClassesInPackageByFile(String?packageName, ??
  10. ????????????String?packagePath,? final ? boolean ?recursive,?Set<Class<?>>?classes)?{ ??
  11. ???????? //?獲取此包的目錄?建立一個(gè)File ??
  12. ????????File?dir?=? new ?File(packagePath); ??
  13. ???????? //?如果不存在或者?也不是目錄就直接返回 ??
  14. ???????? if ?(!dir.exists()?||?!dir.isDirectory())?{ ??
  15. ???????????? //?log.warn("用戶定義包名?"?+?packageName?+?"?下沒有任何文件"); ??
  16. ???????????? return ; ??
  17. ????????} ??
  18. ???????? //?如果存在?就獲取包下的所有文件?包括目錄 ??
  19. ????????File[]?dirfiles?=?dir.listFiles( new ?FileFilter()?{ ??
  20. ???????????? //?自定義過濾規(guī)則?如果可以循環(huán)(包含子目錄)?或則是以.class結(jié)尾的文件(編譯好的java類文件) ??
  21. ???????????? public ? boolean ?accept(File?file)?{ ??
  22. ???????????????? return ?(recursive?&&?file.isDirectory()) ??
  23. ????????????????????????||?(file.getName().endsWith( ".class" )); ??
  24. ????????????} ??
  25. ????????}); ??
  26. ???????? //?循環(huán)所有文件 ??
  27. ???????? for ?(File?file?:?dirfiles)?{ ??
  28. ???????????? //?如果是目錄?則繼續(xù)掃描 ??
  29. ???????????? if ?(file.isDirectory())?{ ??
  30. ????????????????findAndAddClassesInPackageByFile(packageName?+? "." ??
  31. ????????????????????????+?file.getName(),?file.getAbsolutePath(),?recursive, ??
  32. ????????????????????????classes); ??
  33. ????????????}? else ?{ ??
  34. ???????????????? //?如果是java類文件?去掉后面的.class?只留下類名 ??
  35. ????????????????String?className?=?file.getName().substring( 0 , ??
  36. ????????????????????????file.getName().length()?-? 6 ); ??
  37. ???????????????? try ?{ ??
  38. ???????????????????? //?添加到集合中去 ??
  39. ???????????????????? //classes.add(Class.forName(packageName?+?'.'?+?className)); ??
  40. ????????????????????????????????????????? //經(jīng)過回復(fù)同學(xué)的提醒,這里用forName有一些不好,會觸發(fā)static方法,沒有使用classLoader的load干凈 ??
  41. ????????????????????????????????????????classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName?+? '.' ?+?className));?? ??
  42. ????????????????????????????????}? catch ?(ClassNotFoundException?e)?{ ??
  43. ???????????????????? //?log.error("添加用戶自定義視圖類錯(cuò)誤?找不到此類的.class文件"); ??
  44. ????????????????????e.printStackTrace(); ??
  45. ????????????????} ??
  46. ????????????} ??
  47. ????????} ??
  48. ????}??
      /**
	 * 以文件的形式來獲取包下的所有Class
	 * 
	 * @param packageName
	 * @param packagePath
	 * @param recursive
	 * @param classes
	 */
	public static void findAndAddClassesInPackageByFile(String packageName,
			String packagePath, final boolean recursive, Set<Class<?>> classes) {
		// 獲取此包的目錄 建立一個(gè)File
		File dir = new File(packagePath);
		// 如果不存在或者 也不是目錄就直接返回
		if (!dir.exists() || !dir.isDirectory()) {
			// log.warn("用戶定義包名 " + packageName + " 下沒有任何文件");
			return;
		}
		// 如果存在 就獲取包下的所有文件 包括目錄
		File[] dirfiles = dir.listFiles(new FileFilter() {
			// 自定義過濾規(guī)則 如果可以循環(huán)(包含子目錄) 或則是以.class結(jié)尾的文件(編譯好的java類文件)
			public boolean accept(File file) {
				return (recursive && file.isDirectory())
						|| (file.getName().endsWith(".class"));
			}
		});
		// 循環(huán)所有文件
		for (File file : dirfiles) {
			// 如果是目錄 則繼續(xù)掃描
			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(Class.forName(packageName + '.' + className));
                                         //經(jīng)過回復(fù)同學(xué)的提醒,這里用forName有一些不好,會觸發(fā)static方法,沒有使用classLoader的load干凈
                                        classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));  
                               ?} catch (ClassNotFoundException e) {
					// log.error("添加用戶自定義視圖類錯(cuò)誤 找不到此類的.class文件");
					e.printStackTrace();
				}
			}
		}
	}
    
?

?

??????? 自己直接拿過來用了,可以掃描package對應(yīng)的子package,不過是對當(dāng)前classLoad下的所有jar進(jìn)行掃描的。

java讀取指定package下的所有class


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩欧美亚洲一区 | 国产精品大片天天看片 | 无遮挡又黄又爽又色1000部 | 国产动作大片中文字幕 | 亚洲综合站| 黄色影院7755 | www.久久99| 久久久免费观看视频 | 99亚洲视频 | 国产成人精品免费视频大全办公室 | 中文字幕av在线 | 久久这里只精品国产99热 | 欧美婷婷| 一本伊在人香蕉线观新在线 | 免费性网站 | 青青青国产在线视频 | 在线精品国产一区二区 | 四虎永久成人免费 | 七七七久久久久人综合 | 99热久久国产精品这里有6 | 九九视频在线免费观看 | 免费一级大毛片a一观看不卡 | 中文字幕免费在线播放 | 亚洲欧美日韩国产综合久 | 国内精品久久久久久久 | 亚洲在线观看一区 | 欧美成人午夜免费完成 | 亚洲视频一区二区三区四区 | 午夜影院免费体验区 | 国产福利精品在线观看 | 午夜精品在线视频 | 黄黄网| 日韩中文在线观看 | 4hu影院最新地址www | 69美女福利视频在线观看 | 亚洲不卡视频在线 | 色偷偷亚洲女人天堂观看欧 | 国产在线视频二区 | 全网毛片 | 亚色在线播放 | 无遮挡一级毛片性视频不卡 |