java 包scan_Java 包扫描器

包扫描器

获取一个包下的所有类,然后使用默认的类加载器加载到内存中

public static List> scanByPackage(String packageName) throws IOException, URISyntaxException {

//我们传入的包名都是 "com.stdpain.xx" 这种的需要替换成 "com/stdpain/xx"

String packagePath = packageName.replace(".", "/");

//获取当前类加载器

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

List> classes = new ArrayList<>();

Enumeration resources = classLoader.getResources(packagePath);

while (resources.hasMoreElements()) {

//获取 url

URL url = resources.nextElement();

//判断url是不是一个 jar:// 类型的url 不同的url需要有不同的处理方式,我们默认只有文件系统和jar

if (url.getProtocol().equals("jar")) {

//handle jar Package

System.out.println(url);

List> scanedClasses = packageJarScan(url);

classes.addAll(scanedClasses);

} else {

File file = new File(url.toURI());

if (!file.exists()) {

System.out.println("file not exists = " + file.getAbsolutePath());

continue;

}

System.out.println("scan:" + file.getAbsolutePath());

//handle file package

List> scanedClasses = packageScan(file, packageName);

classes.addAll(scanedClasses);

}

}

return classes;

}

Jar 处理

public static List> packageJarScan(URL url) throws IOException {

//强制类型转换

JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();

JarFile jarFile = jarURLConnection.getJarFile();

Enumeration jarEntries = jarFile.entries();

List> classes = new ArrayList<>();

//遍历判断

while (jarEntries.hasMoreElements()) {

JarEntry jarEntry = jarEntries.nextElement();

String jarName = jarEntry.getName();

if (jarEntry.isDirectory() || !jarName.endsWith(".class")) {

continue;

}

String className = jarName.replace(".class", "").replace("/", ".");

try {

System.out.println(className);

Class> clazz = Class.forName(className);

classes.add(clazz);

System.out.println(className + "->load:success");

} catch (ClassNotFoundException e) {

// e.printStackTrace();

System.out.println("e.getMessage() = " + e.getMessage());

}

}

return classes;

}

文件系统直接递归处理目录就可以

public static List> packageScan(File curFile, String packageName) {

ArrayList> classes = new ArrayList<>();

if (!curFile.isDirectory()) {

return classes;

}

File[] files = curFile.listFiles();

for (File file : files) {

if (file.isFile() && file.getName().endsWith(".class")) {

String fileName = file.getName().replace(".class", "");

String className = packageName + "." + fileName;

try {

Class> clazz = Class.forName(className);

classes.add(clazz);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

} else if (file.isDirectory()) {

//如果是个目录那么就递归处理目录

classes.addAll(packageScan(file, packageName + "." + file.getName()));

}

}

return classes;

}

包扫描器有什么用

Spring 中通过注解配置 就是通过包扫描器下每个class是否包含某些注解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值