这个是我在模拟实现Spring的依赖注入(无参构造和注解方式)的小demo时使用到的,因为是scala体系,所以想研究下Java的Spring框架,看有什么可以借鉴的地方。
获得对应包的所有文件:(需要配合后面的findAndAddClassesInPackageByFile方法)
//获得所有的类的Class
protected List<Class<?>> getClasses(String basePackage){
List<Class<?>> classes = new ArrayList<Class<?>>();
// 是否循环迭代
boolean recursive = true;
// 获取包的名字 并进行替换
String packageDirName = basePackage.replace('.', '/');
// 定义一个枚举的集合 并进行循环来处理这个目录下的things
Enumeration<URL> dirs;
try {
dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
// 循环迭代下去
while (dirs.hasMoreElements()) {
// 获取下一个元素
URL url = dirs.nextElement();
// 得到协议的名称
String protocol = url.getProtocol();
// 如果是以文件的形式保存在服务器上
if ("file".equals(protocol)) {
// 获取包的物理路径
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
// 以文件的方式扫描整个包下的文件 并添加到集合中
findAndAddClassesInPackageByFile(basePackage, filePath, recursive, classes);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes;
}
查询包下所有的类,并且添加到集合中:
protected void findAndAddClassesInPackageByFile(String basePackage, String filePath, boolean recursive, List<Class<?>> classes){
// 获取此包的目录 建立一个File
File dir = new File(filePath);
// 如果不存在或者 也不是目录就直接返回
if (!dir.exists() || !dir.isDirectory()) {
return;
}
// 如果存在 就获取包下的所有文件 包括目录
File[] dirfiles = dir.listFiles(new FileFilter() {
// 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
public boolean accept(File file) {
return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
}
});
// 循环所有文件
for (File file : dirfiles) {
// 如果是目录 则继续扫描
if (file.isDirectory()) {
findAndAddClassesInPackageByFile(basePackage + "." + file.getName(), file.getAbsolutePath(), recursive, classes);
} else {
// 如果是java类文件 去掉后面的.class 只留下类名
String className = file.getName().substring(0, file.getName().length() - 6);
try {
// 添加到集合中去
classes.add(Class.forName(basePackage + '.' + className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
本文介绍了一个基于Spring框架的依赖注入小demo,通过无参构造和注解方式实现。文章详细展示了如何在Java环境下使用Spring框架,特别关注了从指定包中获取所有类的Class实例的方法。
333

被折叠的 条评论
为什么被折叠?



