Java_Java中动态加载jar文件和class文件
转自:http://blog.csdn.net/mousebaby808/article/details/31788325
概述
动态加载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_Java中动态加载jar文件和class文件的更多相关文章
- [转载] Java中动态加载jar文件和class文件
转载自http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下 ...
- 【Android】Android动态加载Jar、APK的实现
本文介绍Android中动态加载Jar.APK的实现.而主要用到的就是DexClassLoader这个类.大家都知道Android和普通的Java虚拟机有差别,它只能加载经过处理的dex文件.而加载这 ...
- Java从Jar文件中动态加载类
动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一: ...
- Java动态加载jar及class文件
经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...
- java动态加载jar文件
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, Invo ...
- Android动态加载jar/dex
前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优 ...
- Android动态加载jar、apk的实现
前段时间到阿里巴巴参加支付宝技术分享沙龙,看到支付宝在Android使用插件化的技术,挺好奇的.正好这几天看到了农民伯伯的相关文章,因此简单整理了下,有什么错误希望大神指正. 核心类 1.1 ...
- java动态加载jar包,并运行其中的类和方法
动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一: ...
- 为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件
为不同分辨率单独做样式文件,在页面头部用js判断分辨率后动态加载定义好的样式文件.样式文件命名格式如:forms[_屏幕宽度].css,样式文件中只需重新定义文本框和下拉框的宽度即可. 在包含的头文件 ...
随机推荐
- Jmeter在restful风格接口测试中的应用
1.如何下载安装 官网下载,一个压缩包apache-jmeter-3.0.zip,解压即可,打开bin目录下jmeter.bat即可打开软件. 2.熟悉界面 3.实际案例 测试restful风格接口 ...
- Excel数据挖掘插件
Excel是大家非常熟悉的表格工具,借助它可以实现日程工作中最原始的数据处理的基本的功能,此外通过 SQL Server插件的支持,我们也可以在Excel中实现数据挖掘的功能. 此篇将先介绍Excel ...
- log4net的配置与使用
log4net解决的问题是在.Net下提供一个记录日志的框架,它提供了向多种目标写入的实现,比如利用log4net可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQ ...
- c++ 调用dll
1.首先写一个dll程序并且输出成dll. 新建win32项目,然后在应用程序类型中选择dll. HelloDll.h: #pragma once #ifndef MYDLL_API_EXPORTS ...
- Code Review for SSIS package
以下是我对SSIS包进行code review的一些建议,如果有其他更好的方案欢迎拍砖. A. 查看是否使用了最优的解决方案 1. 最优的结构视图 2. 解决方案,包,任务,组建,参数的命名使用了易读 ...
- 不定义JQuery插件,不要说会JQuery 分类: JavaScript 2014-11-24 14:18 155人阅读 评论(0) 收藏
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...
- Linux 6.5網卡配置
Linux 6.5 網卡配置 路徑:/etc/sysconfig/network-scripts 1.關閉NetworkManager服務 [root@rhcsasm2 network-scripts ...
- 智能车学习(十一)——陀螺仪学习
一.学习说明 感觉就是配置I2C通信,然后直接移植51代码... 二.代码分享: 1.头文件: #ifndef I2C_GYRO_H_ #define I2C_GYRO_H_ /*********** ...
- mysql root用户 远程登录其它机器,看不到数据库
在102上访问101上的数据库里,show databases;看不到里面的库, 需要在101上授权就可以了 GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.16 ...
- Http协议提要
HTTP协议提要 简单来说,HTTP就是一个基于应用层的通信规范:双方要进行通信,大家就要遵守一个规范---HTTP协议.HTTP协议从WWW服务器超文本到本地浏览器 ,可以使浏览器更加高效.HTTP ...