java 扫描_关于Java如何扫描指定package下所有的类

这个Java类实现了扫描指定包下所有字节码文件的全类名功能。它首先检查路径是否为JAR文件,如果是,则通过JarInputStream读取所有类;如果不是,遍历目录查找类文件。类路径扫描器可以接受自定义类加载器,并使用SLF4J进行日志记录。
摘要由CSDN通过智能技术生成

1 packagecom.scan;2

3 importorg.slf4j.Logger;4 importorg.slf4j.LoggerFactory;5

6 importjava.io.File;7 importjava.io.FileInputStream;8 importjava.io.IOException;9 importjava.net.URL;10 importjava.util.ArrayList;11 importjava.util.Arrays;12 importjava.util.List;13 importjava.util.jar.JarEntry;14 importjava.util.jar.JarInputStream;15

16 public class ClasspathPackageScanner implementsPackageScanner{17 private Logger logger = LoggerFactory.getLogger(ClasspathPackageScanner.class);18 privateString basePackage;19 privateClassLoader cl;20

21 /**

22 * 初始化23 *@parambasePackage24 */

25 publicClasspathPackageScanner(String basePackage) {26 this.basePackage =basePackage;27 this.cl =getClass().getClassLoader();28 }29 publicClasspathPackageScanner(String basePackage, ClassLoader cl) {30 this.basePackage =basePackage;31 this.cl =cl;32 }33 /**

34 *获取指定包下的所有字节码文件的全类名35 */

36 public List getFullyQualifiedClassNameList() throwsIOException {37 logger.info("开始扫描包{}下的所有类", basePackage);38 return doScan(basePackage, new ArrayList());39 }40

41 /**

42 *doScan函数43 *@parambasePackage44 *@paramnameList45 *@return

46 *@throwsIOException47 */

48 private List doScan(String basePackage, List nameList) throwsIOException {49 String splashPath =StringUtil.dotToSplash(basePackage);50 URL url = cl.getResource(splashPath); //file:/D:/WorkSpace/java/ScanTest/target/classes/com/scan

51 String filePath =StringUtil.getRootPath(url);52 List names = null; //contains the name of the class file. e.g., Apple.class will be stored as "Apple"

53 if(isJarFile(filePath)) {// 先判断是否是jar包,如果是jar包,通过JarInputStream产生的JarEntity去递归查询所有类54 if(logger.isDebugEnabled()) {55 logger.debug("{} 是一个JAR包", filePath);56 }57 names =readFromJarFile(filePath, splashPath);58 } else{59 if(logger.isDebugEnabled()) {60 logger.debug("{} 是一个目录", filePath);61 }62 names =readFromDirectory(filePath);63 }64 for(String name : names) {65 if(isClassFile(name)) {66 nameList.add(toFullyQualifiedName(name, basePackage));67 } else{68 doScan(basePackage + "." +name, nameList);69 }70 }71 if(logger.isDebugEnabled()) {72 for(String n : nameList) {73 logger.debug("找到{}", n);74 }75 }76 returnnameList;77 }78

79 privateString toFullyQualifiedName(String shortName, String basePackage) {80 StringBuilder sb = newStringBuilder(basePackage);81 sb.append('.');82 sb.append(StringUtil.trimExtension(shortName));83 //打印出结果

84 System.out.println(sb.toString());85 returnsb.toString();86 }87

88 private List readFromJarFile(String jarPath, String splashedPackageName) throwsIOException {89 if(logger.isDebugEnabled()) {90 logger.debug("从JAR包中读取类: {}", jarPath);91 }92 JarInputStream jarIn = new JarInputStream(newFileInputStream(jarPath));93 JarEntry entry =jarIn.getNextJarEntry();94 List nameList = new ArrayList();95 while (null !=entry) {96 String name =entry.getName();97 if (name.startsWith(splashedPackageName) &&isClassFile(name)) {98 nameList.add(name);99 }100

101 entry =jarIn.getNextJarEntry();102 }103

104 returnnameList;105 }106

107 private ListreadFromDirectory(String path) {108 File file = newFile(path);109 String[] names =file.list();110

111 if (null ==names) {112 return null;113 }114

115 returnArrays.asList(names);116 }117

118 private booleanisClassFile(String name) {119 return name.endsWith(".class");120 }121

122 private booleanisJarFile(String name) {123 return name.endsWith(".jar");124 }125

126 /**

127 * For test purpose.128 */

129 public static void main(String[] args) throwsException {130 PackageScanner scan = new ClasspathPackageScanner("com.scan");131 scan.getFullyQualifiedClassNameList();132 }133 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值