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,样式文件中只需重新定义文本框和下拉框的宽度即可. 在包含的头文件 ...
随机推荐
- Freemarker遍历map
map的键尽量是字符串或者数字类型: <#if map?exists> <#list map?keys as key> ${key}---${map[key]} </#l ...
- 攻城狮在路上(壹) Hibernate(二)--- 第一个hibernate程序
1.直接通过JDBC API持久化实体域对象: A.java.sql常用接口和类: DriverManager:驱动程序管理器,负责创建数据库连接. Connection:代表数据库连接. State ...
- 总结列表显示ListView知识点
全选ListView的item条目 单选ListView的条目 多选ListView的item条目 自定义ArrayAdapter动态改变ListView的不同item样式 动态增加和删除ListVi ...
- Dwz下拉菜单的二级联动
在DWZ文档中对组合框combox的是这样描述的: 在传统的select 用class 定义:class=”combox”, html 扩展:保留原有属性name, 增加了属性:ref. ref 属 ...
- 使用python做科学计算
这里总结一个guide,主要针对刚开始做数据挖掘和数据分析的同学 说道统计分析工具你一定想到像excel,spss,sas,matlab以及R语言.R语言是这里面比较火的,它的强项是强大的绘图功能以及 ...
- API和系统调用实现同一方法
“平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 一.基 ...
- 【java基础】内存分析
在上次我们说的<重载与重写>呢,我们遗留了一个问题,就是运行结果的各异性,那今天,我们就来探究一下 内存里的天地. 首先呢,我们把mian ...
- vmstat的使用(查看系统各种负载)
$ vmstatprocs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd f ...
- hdu 5446 Unknown Treasure Lucas定理+中国剩余定理
Unknown Treasure Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- 常用chrome插件推荐
下面打红色的2个强烈推荐使用: FQ的: https://chrome.google.com/webstore/detail/ecross-free/njdjpgffklilbojbobbfecfcg ...