博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java动态加载jar及class文件
阅读量:4697 次
发布时间:2019-06-09

本文共 2684 字,大约阅读时间需要 8 分钟。

    经常碰到需要动态加载jar及class文件的场景。Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件。

一、动态加载jar

// 系统类库路径File libPath = new File(jar文件所在路径);// 获取所有的.jar和.zip文件File[] jarFiles = libPath.listFiles(new FilenameFilter() {	public boolean accept(File dir, String name) {		return name.endsWith(".jar") || name.endsWith(".zip");	}});if (jarFiles != null) {	// 从URLClassLoader类中获取类所在文件夹的方法	// 对于jar文件,可以理解为一个存放class文件的文件夹	Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);	boolean accessible = method.isAccessible();		// 获取方法的访问权限	try {		if (accessible == false) {			method.setAccessible(true);		// 设置方法的访问权限		}		// 获取系统类加载器		URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();		for (File file : jarFiles) {			URL url = file.toURI().toURL();			try {				method.invoke(classLoader, url);  				LOG.debug("读取jar文件[name={}]", file.getName());			} catch (Exception e) {				LOG.error("读取jar文件[name={}]失败", file.getName());			}		}	} finally {		method.setAccessible(accessible);	}}

 二、动态加载class文件

// 设置class文件所在根路径// 例如/usr/java/classes下有一个test.App类,则/usr/java/classes即这个类的根路径,而.class文件的实际位置是/usr/java/classes/test/App.classFile clazzPath = new File(class文件所在根路径);// 记录加载.class文件的数量int clazzCount = 0;if (clazzPath.exists() && clazzPath.isDirectory()) {	// 获取路径长度	int clazzPathLen = clazzPath.getAbsolutePath().length() + 1;	Stack
stack = new Stack<>(); stack.push(clazzPath); // 遍历类路径 while (stack.isEmpty() == false) { File path = stack.pop(); File[] classFiles = path.listFiles(new FileFilter() { public boolean accept(File pathname) { return pathname.isDirectory() || pathname.getName().endsWith(".class"); } }); for (File subFile : classFiles) { if (subFile.isDirectory()) { stack.push(subFile); } else { if (clazzCount++ == 0) { Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); boolean accessible = method.isAccessible(); try { if (accessible == false) { method.setAccessible(true); } // 设置类加载器 URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); // 将当前类路径加入到类加载器中 method.invoke(classLoader, clazzPath.toURI().toURL()); } finally { method.setAccessible(accessible); } } // 文件名称 String className = subFile.getAbsolutePath(); className = className.substring(clazzPathLen, className.length() - 6); className = className.replace(File.separatorChar, '.'); // 加载Class类 Class.forName(className); LOG.debug("读取应用程序类文件[class={}]", className); } } }}

 完成上述两步操作后,即可使用Class.forName来加载jar中或.class文件包含的Java类了。

转载于:https://www.cnblogs.com/moonandstar08/p/5827806.html

你可能感兴趣的文章
拓扑排序
查看>>
NYOJ--32--SEARCH--组合数
查看>>
JMS
查看>>
gulpfile 压缩模板
查看>>
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>
【 henuacm2016级暑期训练-动态规划专题 A 】Cards
查看>>
第五篇:白话tornado源码之褪去模板的外衣
查看>>
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
21世纪经济网APP
查看>>
解决NetworkOnMainThreadException
查看>>
1039 到底买不买
查看>>
农银电商项目学习笔记(一)
查看>>
MockObject
查看>>
Chukwa
查看>>
(转)Maven仓库——私服介绍
查看>>
设计模式之工厂模式
查看>>
仿复制粘贴功能,长按弹出tips的实现
查看>>
Kubernetes-Host网络模式应用
查看>>
第三次作业
查看>>