经常碰到需要动态加载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.class
File clazzPath = new File(class文件所在根路径);// 记录加载.class文件的数量
int clazzCount = 0;if (clazzPath.exists() && clazzPath.isDirectory()) {// 获取路径长度int clazzPathLen = clazzPath.getAbsolutePath().length() + 1;Stack<File> 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类了。

Java动态加载jar及class文件相关推荐

  1. java动态加载jar时,jar中还有第三方jar无法加载的解决方法

    java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...

  2. java动态加载jar文件并执行方法

    在项目开发的过程中,有时候需要动态灵活的加载某个jar包并执行里面的方法的时候,我们可以使用本篇文章写得方式去动态的加载jar包而不用使用原始方式引入jar包作为lib去使用,接下来介绍如何动态加载j ...

  3. JAVA动态加载JAR包执行程序

    入口代码 import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.ne ...

  4. flink sql udf jar包_Java动态加载Jar实例解析

    导读:在实际项目开发中,有时会遇到需动态加载jar包的应用场景.如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用.下面将举一个简 ...

  5. android动态jar,Android动态加载Jar(包含第三方依赖Jar)

    最近项目有一个需求,需要根据用户需求动态加载APP内某功能模块,且当该部分功能模块代码有变动,只需更新该功能JAR,无需更新整个APK,基于这个需求,决定采用动态加载Jar的方式去实现,于是各种查资料 ...

  6. [转]Android动态加载jar/dex

    本文转自:http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html 前言 在目前的软硬件环境下,Native App与Web App ...

  7. echarts java动态数据_[ASP.net教程]ECharts Java 动态加载数据,echartsjava

    [ASP.net教程]ECharts Java 动态加载数据,echartsjava 0 2015-12-18 00:00:05 1.前台jsp页面html PUBLIC "-//W3C// ...

  8. Spring实战之Spring动态加载jar模块和卸载模块

    加载 Spring提供了下面这些类来加载外部jar. classPathResorce可以用来加载类路径上的jar. 一般推荐使用 classLoader = new UrlClassLoader(n ...

  9. [转]动态加载jar文件

    本文转自:http://zhongzhao-2008.iteye.com/blog/201487 初学Java时教科书告诉我们,若要运行Java程序,必需为其设置环境变量.有时候为了实现某种功能(例如 ...

最新文章

  1. SAP PM 初级系列9 - 定义功能位置的安装
  2. HALCON查找圆心C++实现
  3. 详解JDBC与Hibernate区别
  4. [转] 有什么郁闷的就看看这驴!
  5. leetcode 435. Non-overlapping Intervals | 435. 无重叠区间(单调栈)
  6. android动画Rotate
  7. 腾讯云服务器数据盘买多了,腾讯云Windows云服务器数据盘分区和格式化
  8. 顶级技术大咖,揭秘实时音视频开发的超级风口
  9. ip在线代理网页联合早报_一次免费代理ip的爬取实战
  10. emacs .emacs_谁在乎Emacs?
  11. git add后取消_满满干货!——Git知识总结
  12. UVa 10570 - Meeting with Aliens
  13. 解决python中No module named ‘numpy‘问题
  14. 正则表达式验证注册页面
  15. CMD如何进入C:WINDOWS\SYSTEM32
  16. mongodb数据检索大全
  17. 用Jplayer做的一个带动画的播放器
  18. 中文关键词提取tfidf算法改进bsaeline
  19. Java String.contains()方法
  20. 【转】Python实现量化选股

热门文章

  1. linux ftp中文乱码方块,Ubuntu下NetBeans中文乱码及方框问题的解决方法
  2. 校园表白墙-带后台源码
  3. try-catch捕获异常信息后Spring事务失效处理方法
  4. WAMP + Zend Framework + Zend Studio For Eclipse 开发环境搭建
  5. MongoDB 教程五: MongoDB固定集合和性能优化
  6. [Magento error] The url is not accessible, unable to read response
  7. Linux中修改环境变量及生效方法
  8. ubuntu编辑器terminator与vim
  9. LeetCode 563. Binary Tree Tilt
  10. 【今日CS 视觉论文速览】10 Dec 2018