private static Map<String, Object> loadAllJarFromAbsolute(String directoryPath) throws
NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException { File directory = new File(directoryPath);
// 判断是否为文件夹,如果是文件,直接用单个jar解析的方法去解析
if (!directory.isDirectory()) {
// 添加jar扫描路径
addUrl(directory);
return loadJarFromAbsolute(directoryPath);
}
// 如果是文件夹,则需要循环加载当前文件夹下面的所有jar
Map<String, Object> clazzMap = new HashMap<>(16);
File[] jars = directory.listFiles();
if (jars != null && jars.length > 0) {
List<String> jarPath = new LinkedList<>();
for (File file : jars) {
String fPath = file.getPath();
// 只加载jar
if (fPath.endsWith(".jar")) {
addUrl(file);
jarPath.add(fPath);
}
}
if (jarPath.size() > 0) {
for (String path : jarPath) {
clazzMap.putAll(loadJarFromAbsolute(path));
}
}
}
return clazzMap;
} private static Map<String, Object> loadJarFromAbsolute(String path) throws IOException {
JarFile jar = new JarFile(path);
Enumeration<JarEntry> entryEnumeration = jar.entries();
Map<String, Object> clazzMap = new HashMap<>(32);
while (entryEnumeration.hasMoreElements()) {
JarEntry entry = entryEnumeration.nextElement();
// 先获取类的名称,符合条件之后再做处理,避免处理不符合条件的类
String clazzName = entry.getName();
if (clazzName.endsWith(".class")) {
// 去掉文件名的后缀
clazzName = clazzName.substring(0, clazzName.length() - 6);
// 替换分隔符
clazzName = clazzName.replace("/", ".");
// 加载类,如果失败直接跳过
try {
Class<?> clazz = Class.forName(clazzName);
Class superClass = clazz.getSuperclass();
if (superClass.equals(ComponentExtend.class)) {
Object o = clazz.newInstance();
Method fieldExtendComponentId = clazz.getMethod("extendComponentId");
String id = (String) fieldExtendComponentId.invoke(o);
clazzMap.put(id, o);
}
} catch (Throwable e) {
// 这里可能出现有些类是依赖不全的,直接跳过,不做处理,也没法做处理
}
}
}
return clazzMap;
} private static void addUrl(File jarPath) throws NoSuchMethodException, InvocationTargetException,
IllegalAccessException, MalformedURLException { URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
if (!method.isAccessible()) {
method.setAccessible(true);
}
URL url = jarPath.toURI().toURL();
// 把当前jar的路径加入到类加载器需要扫描的路径
method.invoke(classLoader, url);
}

JAVA 扫描指定路径下所有的jar包,并保存所有实现固定接口的类型的更多相关文章

  1. java监控指定路径下文件及文件夹变化

    之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包.主要有下面几点不同:1. WatchService是采用扫描式 ...

  2. java获取指定路径下的指定文件/java.io.File.listFiles(FilenameFilter filter)

    java.io.File.listFiles(FilenameFilter filter) 返回抽象路径名数组,表示在目录中此抽象路径名表示,满足指定过滤器的文件和目录. 声明 以下是java.io. ...

  3. Python—导入自定义的模块和包(指定路径下的模块和包)

    模块路径如下图: import sys sys.path.append(r"E:\project\path") print "===>", sys.arg ...

  4. java 压缩文件 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件

    /** * 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件 * * @param files * 文件数组 * @param strZipName * 压缩文件路径及文件名 * @thr ...

  5. java读取指定package下的所有class

     JAVA如何扫描一个包下面的所有类,并加载到内存中去? spring中有一个<context:component-scan base-package="com.controller& ...

  6. Java 读取指定目录下的文件名和目录名

    需求:读取指定目录下的文件名和目录名 实现如下: package com.test.common.util; import java.io.File; public class ReadFile { ...

  7. C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名

    1.实现把指定文件夹下的所有文件复制到指定路径下 public static void copyFiles(string path) { DirectoryInfo dir = new Directo ...

  8. matlab读取指定路径下的图像

    利用matlab读取指定路径下的图像 %% 读入指定路径imgFolder下的图像imgName imgFolder = 'F:\博\快盘\图像+数据\images\文章实验图'; %指定路径 img ...

  9. 指定路径下建立Access数据库并插入数据

    今天刚刚开通博客,想要把我这几天完成小任务的过程,记录下来.我从事软件开发的时间不到1年,写的不足之处,还请前辈们多多指教. 上周四也就是2016-04-14号上午,部门领导交给我一个小任务,概括来讲 ...

随机推荐

  1. 015_matlab运行C语言

    视频教程:https://v.qq.com/x/page/q3039wsuged.html 资料下载:https://download.csdn.net/download/xiaoguoge11/12 ...

  2. linux高性能服务器编程 (五) --Linux网络编程基础api

    第五章 Linux网络编程基础api 1.主机字节序和网络字节序 字节序是指整数在内存中保存的顺序.字节序分为大端字节序.小端字节序. 大端字节序:一个整数的高位字节数据存放在内存的低地址处.低位字节 ...

  3. 在Eclipse打开css文件时,会自动调用文本编辑器打开,而不是在Eclipse中打开

    问题描述 在Eclipse中打开css文件时候,如下图,使用系统自带的文本编辑器打开 解决方案 点击Window下的Preference,找到File Associations,然后点击Add,将cs ...

  4. js逆向分析之acorn和escodegen的使用

    替换之前的d形如 d("77696669") 执行代码 const fs = require('fs'); const acorn = require('acorn'); cons ...

  5. No Suitable Driver Found For Jdbc

    今天出现编码出现了No suitable driver found for jdbc,又是找遍了网上的资料,基本上都说是三个问题:    一是:连接URL格式出现了问题(Connection conn ...

  6. 用Python自动办公,做职场高手(完结)

    教程目录: ┣━07.S2 Word自动化处理,又快又好做文档┃  ┣━36 本章介绍┣━08.[Word]S2-1 轻松用Python快速生成Word文档┃  ┣━45.[真实案例]S2-1-3 批 ...

  7. Javascript Date构造函数和比较 (二)

    JavaScript Date对象 构造函数实例 Date构造函数中没有参数,将返回当前日期 var currentDate = new Date(); writeLine(currentDate.t ...

  8. NioEventLoopGroup源码分析与线程设定

    我的以Netty Socket编程的代码为例, 1.EventLoopGroup 进入EventLoopGroup,这是一个特殊的EventExecutorGroup,在事件循环中,在selectio ...

  9. PHP系列 | 代码复用trait的构造函数使用

    在ThinkPHP5.1 框架中自己封装了一个 trait 类,每次都在控制器中使用,但是在使用框架自身的验证器类(框架控制器方法)报错 在控制器中使用自定义验证器 $param = $this-&g ...

  10. 通过mitmproxy爬取APP的数据

    安装: https://mitmproxy.org/ 小米安装证书 设置->系统安全->从存储设备安装->选择*.pem文件 模拟器安装证书 (请从C:\Users\John\.mi ...