[转载] 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中动态加载jar文件和class文件的更多相关文章
- Java_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 ...
- java动态加载jar包,并运行其中的类和方法
动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一: ...
- JAVA动态加载JAR包的实现
如何动态的加载这些驱动!不可能把所有的数据库驱动都集成到JAR包中吧?!于是动态加载驱动的JAR包就产生了!其实这些在做系统基础代码时,经常用到,只是一般我们没有机会去搞而已. 动态加载JAR包,使用 ...
- 某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
在某APK中,通过如下方法动态注册了一个BroadcastReceiver,代码参考如下: @Override protected void onAttachedToWindow() { super. ...
- Android动态加载jar/dex
前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优 ...
随机推荐
- BS4爬取糗百
-- coding: cp936 -- import urllib,urllib2 from bs4 import BeautifulSoup user_agent='Mozilla/5.0 (Win ...
- MSSQL查询数据分页
这几天刚好碰到数据的分页查询,觉得不错,Mark一下,方法有两种,都是使用select top,效率如何就不在这讨论 方法1:利用select top配合not in(或者not exists),查询 ...
- Jquery实现鼠标移到某个对象,弹出显示层。
/** * 鼠标移上去显示层 * @param divId 显示的层ID * @returns */ $.fn.myHoverTip = function(divId) { var div = $(& ...
- PPLB条码打印
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 前端页面卡顿、也许是DOM操作惹的祸?
界面上UI的更改都是通过DOM操作实现的,并不是通过传统的刷新页面实现 的.尽管DOM提供了丰富接口供外部调用,但DOM操作的代价很高,页面前端代码的性能瓶颈也大多集中在DOM操作上,所以前端性能优化 ...
- Linux命令-基本命令(1)
1. ll dfdfdfd 2. vi dfffd
- JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA - 2
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7704914.html ------------------------------------ ...
- Java常用类(一)String类详解
前言 在我们开发中经常会用到很多的常用的工具类,这里做一个总结.他们有很多的方法都是我们经常要用到的.所以我们一定要把它好好的掌握起来! 一.String简介 1.1.String(字符串常量)概述 ...
- 深入理解final和static关键字
深入理解final和static关键字 参考:http://blog.csdn.net/qq1028951741/article/details/53418852 final关键字 final关键字可 ...
- celery rabbit mq 详解
Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, ...