java扫描包下类_实现获取扫描指定包路径下的jar文件或class文件JarPojoHandler类示例代码...
通過JarPojoHandler類實現(xiàn)了掃描指定路徑下如何獲取所有的JAR包或class文件,可以對特定class對象文件篩選過濾等,具體代碼如下所示import?java.io.File;@b@import?java.io.FileFilter;@b@import?java.io.IOException;@b@import?java.net.JarURLConnection;@b@import?java.net.URL;@b@import?java.net.URLClassLoader;@b@import?java.net.URLDecoder;@b@import?java.util.ArrayList;@b@import?java.util.Enumeration;@b@import?java.util.HashMap;@b@import?java.util.LinkedHashSet;@b@import?java.util.List;@b@import?java.util.Map;@b@import?java.util.Set;@b@import?java.util.jar.JarEntry;@b@import?java.util.jar.JarFile;@b@@b@/**@b@?*?掃描指定包(包括jar)下的class文件?
?@b@?*/@b@public?class?JarPojoHandler?{@b@private?static?Map>>?pojoClasses?=?new?HashMap>>();@b@@b@/**@b@?*?獲得指定路徑下的所有?JAR包@b@?*?@param?strPath@b@?*?@return@b@?*/@b@public?static?List?getDirFiles(String?strPath)?{@b@List?list?=?new?ArrayList();@b@File?f?=?new?File(strPath);@b@if?(f.isDirectory())?{@b@File[]?fList?=?f.listFiles();@b@for?(int?j?=?0;?j?>?getClazzInstances(File?file,?String?packages,@b@String?current)?{@b@try?{@b@if?(file?==?null)?return?null;@b@URLClassLoader?loader?=?new?URLClassLoader(new?URL[]?{?new?URL(@b@"file:"?+?file.getAbsolutePath())?},?Thread.currentThread()@b@.getContextClassLoader());@b@List>?classinstances?=?new?ArrayList>();@b@JarFile?jarFile?=?new?JarFile(file);@b@Enumeration>?enum1?=?jarFile.entries();@b@List>?clzlist?=?JarPojoHandler.pojoClasses.get(current);@b@if(clzlist?==?null?)?{@b@clzlist?=?new?ArrayList>();@b@pojoClasses.put(current,?clzlist);@b@}@b@while?(enum1.hasMoreElements())?{@b@JarEntry?entry?=?(JarEntry)?enum1.nextElement();@b@if?(entry.isDirectory())?continue;@b@String?jar?=?entry.getName();@b@if?(jar.endsWith(".class"))?{@b@String?clzname?=?jar.substring(0,?jar.lastIndexOf(".class")).replace('/',?'.');@b@String?clzpackage?=?clzname.substring(0,?clzname.lastIndexOf("."));@b@String?currentpackage?=?packages?+?"."?+?current?+?".bean";@b@if?(clzpackage.equals(currentpackage))?{@b@Class>?clz?=?loader.loadClass(clzname);@b@classinstances.add(clz);@b@}@b@if?(clzname.startsWith(packages))?{@b@Class>?clz?=?loader.loadClass(clzname);@b@clzlist.add(clz);@b@}@b@}@b@}@b@if(jarFile?!=?null)?jarFile.close();@b@return?classinstances;@b@}?catch?(Exception?e)?{@b@e.printStackTrace();@b@}@b@return?null;@b@}@b@@b@public?static?Set>?getClasses(String?pack)?{@b@//?第一個class類的集合@b@Set>?classes?=?new?LinkedHashSet>();@b@//?是否循環(huán)迭代@b@boolean?recursive?=?true;@b@//?獲取包的名字?并進(jìn)行替換@b@String?packageName?=?pack;@b@String?packageDirName?=?packageName.replace('.',?'/');@b@//?定義一個枚舉的集合?并進(jìn)行循環(huán)來處理這個目錄下的things@b@Enumeration?dirs;@b@try?{@b@dirs?=?Thread.currentThread().getContextClassLoader().getResources(packageDirName);@b@//?循環(huán)迭代下去@b@while?(dirs.hasMoreElements())?{@b@//?獲取下一個元素@b@URL?url?=?dirs.nextElement();@b@//?得到協(xié)議的名稱@b@String?protocol?=?url.getProtocol();@b@//?如果是以文件的形式保存在服務(wù)器上@b@if?("file".equals(protocol))?{@b@//?file類型的掃描@b@//?獲取包的物理路徑@b@String?filePath?=?URLDecoder.decode(url.getFile(),?"UTF-8");@b@//?以文件的方式掃描整個包下的文件?并添加到集合中@b@findAndAddClassesInPackageByFile(packageName,?filePath,?recursive,?classes);@b@}?else?if?("jar".equals(protocol))?{@b@//?如果是jar包文件@b@//?定義一個JarFile@b@//?jar類型的掃描@b@JarFile?jar;@b@try?{@b@//?獲取jar@b@jar?=?((JarURLConnection)?url.openConnection()).getJarFile();@b@//?從此jar包?得到一個枚舉類@b@Enumeration?entries?=?jar.entries();@b@//?同樣的進(jìn)行循環(huán)迭代@b@while?(entries.hasMoreElements())?{@b@//?獲取jar里的一個實體?可以是目錄?和一些jar包里的其他文件?如META-INF等文件@b@JarEntry?entry?=?entries.nextElement();@b@String?name?=?entry.getName();@b@//?如果是以/開頭的@b@if?(name.charAt(0)?==?'/')?{@b@//?獲取后面的字符串@b@name?=?name.substring(1);@b@}@b@//?如果前半部分和定義的包名相同@b@if?(name.startsWith(packageDirName))?{@b@int?idx?=?name.lastIndexOf('/');@b@//?如果以"/"結(jié)尾?是一個包@b@if?(idx?!=?-1)?{@b@//?獲取包名?把"/"替換成"."@b@packageName?=?name.substring(0,?idx).replace('/',?'.');@b@}@b@//?如果可以迭代下去?并且是一個包@b@if?((idx?!=?-1)?||?recursive)?{@b@//?如果是一個.class文件?而且不是目錄@b@if?(name.endsWith(".class")?&&?!entry.isDirectory())?{@b@//?去掉后面的".class"?獲取真正的類名@b@String?className?=?name.substring(packageName.length()?+?1,?name.length()?-?6);@b@try?{@b@//?添加到classes@b@classes.add(Class.forName(packageName?+?'.'?+?className));@b@}?catch?(ClassNotFoundException?e)?{@b@//?.error("添加用戶自定義視圖類錯誤?找不到此類的.class文件");@b@e.printStackTrace();@b@}@b@}@b@}@b@}@b@}@b@}?catch?(IOException?e)?{@b@//?log.error("在掃描用戶定義視圖時從jar包獲取文件出錯");@b@e.printStackTrace();@b@}@b@}@b@}@b@}?catch?(IOException?e)?{@b@e.printStackTrace();@b@}@b@return?classes;@b@}@b@@b@public?static?void?findAndAddClassesInPackageByFile(String?packageName,@b@String?packagePath,?final?boolean?recursive,?Set>?classes)?{@b@//?獲取此包的目錄?建立一個File@b@File?dir?=?new?File(packagePath);@b@//?如果不存在或者?也不是目錄就直接返回@b@if?(!dir.exists()?||?!dir.isDirectory())?{@b@//?log.warn("用戶定義包名?"?+?packageName?+?"?下沒有任何文件");@b@return;@b@}@b@//?如果存在?就獲取包下的所有文件?包括目錄@b@File[]?dirfiles?=?dir.listFiles(new?FileFilter()?{@b@//?自定義過濾規(guī)則?如果可以循環(huán)(包含子目錄)?或則是以.class結(jié)尾的文件(編譯好的java類文件)@b@public?boolean?accept(File?file)?{@b@return?(recursive?&&?file.isDirectory())?||?(file.getName().endsWith(".class"));@b@}@b@});@b@//?循環(huán)所有文件@b@for?(File?file?:?dirfiles)?{@b@//?如果是目錄?則繼續(xù)掃描@b@if?(file.isDirectory())?{@b@findAndAddClassesInPackageByFile(packageName?+?"."?+?file.getName(),?file.getAbsolutePath(),?recursive,?classes);@b@}?else?{@b@//?如果是java類文件?去掉后面的.class?只留下類名@b@String?className?=?file.getName().substring(0,?file.getName().length()?-?6);@b@try?{@b@//?添加到集合中去@b@//?classes.add(Class.forName(packageName?+?'.'?+??className));@b@//?經(jīng)過回復(fù)同學(xué)的提醒,這里用forName有一些不好,會觸發(fā)static方法,沒有使用classLoader的load干凈@b@classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName?+?'.'?+?className));@b@}?catch?(ClassNotFoundException?e)?{@b@//?log.error("添加用戶自定義視圖類錯誤?找不到此類的.class文件");@b@e.printStackTrace();@b@}@b@}@b@}@b@}@b@@b@public?static?Map>>?getPojoClasses()?{@b@return?pojoClasses;@b@}@b@@b@public?static?void?realese()?{@b@pojoClasses.clear();@b@}@b@@b@}
總結(jié)
以上是生活随笔為你收集整理的java扫描包下类_实现获取扫描指定包路径下的jar文件或class文件JarPojoHandler类示例代码...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java正则 环视_正则表达式之环视(j
- 下一篇: python累积和_python – 如