Java 包扫描器
包扫描器
获取一个包下的所有类,然后使用默认的类加载器加载到内存中
public static List<Class<?>> scanByPackage(String packageName) throws IOException, URISyntaxException {
//我们传入的包名都是 "com.stdpain.xx" 这种的需要替换成 "com/stdpain/xx"
String packagePath = packageName.replace(".", "/");
//获取当前类加载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
List<Class<?>> classes = new ArrayList<>();
Enumeration<URL> 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<Class<?>> 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<Class<?>> scanedClasses = packageScan(file, packageName);
classes.addAll(scanedClasses);
}
}
return classes;
}
Jar 处理
public static List<Class<?>> packageJarScan(URL url) throws IOException {
//强制类型转换
JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();
JarFile jarFile = jarURLConnection.getJarFile();
Enumeration<JarEntry> jarEntries = jarFile.entries();
List<Class<?>> 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<Class<?>> packageScan(File curFile, String packageName) {
ArrayList<Class<?>> 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是否包含某些注解
Java 包扫描器的更多相关文章
- 全栈的自我修养: 0005 Java 包扫描实现和应用(Jar篇)
全栈的自我修养: 0005 Java 包扫描实现和应用(Jar篇) It's not the altitude, it's the attitude. 决定一切的不是高度而是态度. Table of ...
- Spring利器之包扫描器
在学习Spring这门技术中为了大大减少applicationContext.xml配置的代码量于是有了包扫描器. 闲话不多说我们马上来实现一下吧 示例架构如下: 第一步我们先来修改我们的配置appl ...
- Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB
Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...
- 在Eclipse工具里创建maven的web工程,在建立src/main/java包出现The folder is already a source folder.解决
1. 与创建普通java工程一样,点击右键找到New菜单,在弹出的界面输入maven ---->>点击maven Project------>>点击next 2 进入下一个界 ...
- android工程gen目录中R.java包名是怎么确定
新建一个工程,包名用的com.mythroad.adskiller, 后来觉得不好,又改成com.mythroad.adsinscepter,但是我发现gen下的R.java文件的包名还是原来的com ...
- JavaSE复习日记 : java包机制
这里是第一个文件,命名为JavaSE_01.java,我在这个文件里面声明了一个m1()方法,通过包机制,我将在另外一个文件夹里访问这个文件里的东西,确切的说是访问这个文件生成的一个class文件; ...
- 6、Java包的命名与划分
6.包的命名与划分 (一)使用Java包的目的 在了解做一件事之前,需要了解做这件事的目的.而使用Java包的目的大概如下: 1 对类进行归类,便于开发查找. 2 将软件在代码层面上模块化 ...
- 列出JDK中常用的Java包
列出JDK中常用的Java包 1.java.lang 2.java.sql 3.java.io 4.java.math 5.java.text 6.java.net 7.java.util 8.jav ...
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
随机推荐
- CF932F Escape Through Leaf(DP,斜率优化)
SB 题. 写出 DP 方程:\(f_i\) 表示从 \(i\) 跳的最小值. \(i\) 是叶子就是 \(0\),否则就是选个子树中的 \(v\),\(f_i=\min(f_v+a_ib_v)\). ...
- 用户增长模型AARRR模型
用户增长模型AARRR模型
- 二进制安装K8S集群V1.16.3
centos linux7.5 cat > /etc/hosts << EOF 192.168.199.221 master 192.168.199.222 node1 192.16 ...
- jenkins pipeline 复杂的发布流程
1.参数化构建界面 2.交付流水线界面 3.脚本详解 #!groovy pipeline { //在任何可用的代理上执行Pipeline agent any //参数化变量,目前只支持[boolean ...
- 使用Linq判断DataTable数据是否重复
我们一般系统在导入数据的时候,一般都是通过NPOI将excel数据转换成DataTable,然后将DataTable导入到数据库.在数据导入的过程中,其实很重要的一部就是检查DataTable中的数据 ...
- 使用python把gdb格式的文本文件转为utf-8的格式
# coding=utf-8 from os import listdir if __name__ =="__main__": d=u"D:\\files\\" ...
- Docker修改已创建容器端口映射
修改已创建容器端口映射. 通过编辑 hostconfig.json 文件来修改 Docker 容器的端口映射 该文件地址:/var/lib/docker/containers/[hash_of_the ...
- GT性能测试Android版使用说明
1 GT简介 GT(随身调) Android版是腾讯 MIG 专项测试组自行研发的 Android APP 随身调测平台,它是直接运行在手机上的“集成调测环境”(ITE, Integrated Tes ...
- [转] Performance_js中计算网站性能监控利器
1.Performance方法 Performance提供的方法可以灵活使用,获取到页面加载等标记的耗时情况. performance.now() //返回当前到页面打开时刻的耗时,精确到千分之一毫秒 ...
- redis 实战操作RDB和AOF快照持久化
前言:redis是我们常用的缓存方式,今天就来介绍下两种持久化的方式吧,先科普概念,再实战操作 一.RDB Redis将某一时刻的快照(备份的数据库数据)保存成一种称为RDB格式的文件中,这种格式是经 ...