java scan package_Java如何扫描指定package下所有的类

/**

* This scanner is used to find out all classes in a package.

* Created by whf on 15-2-26.

*/

public class ClasspathPackageScanner implements PackageScanner {

private Logger logger = LoggerFactory.getLogger(ClasspathPackageScanner.class);

private String basePackage;

private ClassLoader cl;

/**

* Construct an instance and specify the base package it should scan.

*@param basePackage The base package to scan.

*/

public ClasspathPackageScanner(String basePackage) {

this.basePackage = basePackage;

this.cl = getClass().getClassLoader();

}

/**

* Construct an instance with base package and class loader.

*@param basePackage The base package to scan.

*@param cl Use this class load to locate the package.

*/

public ClasspathPackageScanner(String basePackage, ClassLoader cl) {

this.basePackage = basePackage;

this.cl = cl;

}

/**

* Get all fully qualified names located in the specified package

* and its sub-package.

*

*@return A list of fully qualified names.

*@throws IOException

*/

@Override

public List getFullyQualifiedClassNameList() throws IOException {

logger.info("开始扫描包{}下的所有类", basePackage);

return doScan(basePackage, new ArrayList<>());

}

/**

* Actually perform the scanning procedure.

*

*@param basePackage

*@param nameList A list to contain the result.

*@return A list of fully qualified names.

*

*@throws IOException

*/

private List doScan(String basePackage, List nameList) throws IOException {

// replace dots with splashes

String splashPath = StringUtil.dotToSplash(basePackage);

// get file path

URL url = cl.getResource(splashPath);

String filePath = StringUtil.getRootPath(url);

// Get classes in that package.

// If the web server unzips the jar file, then the classes will exist in the form of

// normal file in the directory.

// If the web server does not unzip the jar file, then classes will exist in jar file.

List names = null; // contains the name of the class file. e.g., Apple.class will be stored as "Apple"

if (isJarFile(filePath)) {

// jar file

if (logger.isDebugEnabled()) {

logger.debug("{} 是一个JAR包", filePath);

}

names = readFromJarFile(filePath, splashPath);

} else {

// directory

if (logger.isDebugEnabled()) {

logger.debug("{} 是一个目录", filePath);

}

names = readFromDirectory(filePath);

}

for (String name : names) {

if (isClassFile(name)) {

//nameList.add(basePackage + "." + StringUtil.trimExtension(name));

nameList.add(toFullyQualifiedName(name, basePackage));

} else {

// this is a directory

// check this directory for more classes

// do recursive invocation

doScan(basePackage + "." + name, nameList);

}

}

if (logger.isDebugEnabled()) {

for (String n : nameList) {

logger.debug("找到{}", n);

}

}

return nameList;

}

/**

* Convert short class name to fully qualified name.

* e.g., String -> java.lang.String

*/

private String toFullyQualifiedName(String shortName, String basePackage) {

StringBuilder sb = new StringBuilder(basePackage);

sb.append(‘.‘);

sb.append(StringUtil.trimExtension(shortName));

return sb.toString();

}

private List readFromJarFile(String jarPath, String splashedPackageName) throws IOException {

if (logger.isDebugEnabled()) {

logger.debug("从JAR包中读取类: {}", jarPath);

}

JarInputStream jarIn = new JarInputStream(new FileInputStream(jarPath));

JarEntry entry = jarIn.getNextJarEntry();

List nameList = new ArrayList<>();

while (null != entry) {

String name = entry.getName();

if (name.startsWith(splashedPackageName) && isClassFile(name)) {

nameList.add(name);

}

entry = jarIn.getNextJarEntry();

}

return nameList;

}

private List readFromDirectory(String path) {

File file = new File(path);

String[] names = file.list();

if (null == names) {

return null;

}

return Arrays.asList(names);

}

private boolean isClassFile(String name) {

return name.endsWith(".class");

}

private boolean isJarFile(String name) {

return name.endsWith(".jar");

}

/**

* For test purpose.

*/

public static void main(String[] args) throws Exception {

PackageScanner scan = new ClasspathPackageScanner("cn.fh.lightning.bean");

scan.getFullyQualifiedClassNameList();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值