//通过key获取需要的 可以配置在配置文件或者解析jar包存库,解析jar的话注意jar需要特定文件指定解析操作
private Map<String, WService> services = new ConcurrentHashMap<>();
public Optional<WService> getWService(String channelCode,String filePath) {
try {
//加载新引入的jar
if(!StringUtils.isEmpty(filePath)){
// loadJar(filePath);
loadJar("D:\\jarload\\test.jar");
//获取新引入的jar的实现类
ServiceLoader<WService> serviceLoader = ServiceLoader.load(WService.class);
for (WService wService : serviceLoader) {
services.put(wService.getChannelCode(), wService);
}
}
} catch (Exception e) {
System.err.println(e);
}
return services.get(channelCode);
}
private static void loadJar(String jarPath) throws MalformedURLException {
File jarFile = new File(jarPath); // 从URLClassLoader类中获取类所在文件夹的方法,jar也可以认为是一个文件夹
if (jarFile.exists() == false) {
System.out.println("jar file not found.");
return;
}
// 获取类加载器的addURL方法,准备动态调用
Method method = null;
try {
method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
} catch (NoSuchMethodException | SecurityException e1) {
e1.printStackTrace();
}
// 获取方法的访问权限,保存原始值
boolean accessible = method.isAccessible();
try {
// 修改访问权限为可写
if (accessible == false) {
method.setAccessible(true);
}
// 获取系统类加载器
URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
// 获取jar文件的url路径
java.net.URL url = jarFile.toURI().toURL();
// jar路径加入到系统url路径里
method.invoke(classLoader, url);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 回写访问权限
method.setAccessible(accessible);
}
}
jar暂时不写名
最新推荐文章于 2024-09-17 11:50:15 发布