[转载] 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的优 ...
随机推荐
- Spring ——简介及环境搭建跑通Hello
Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.是为了解决企业应用程序开发复杂性而创建的.框架的主要优 ...
- php设计模式 工厂模式和单例模式
一.单例模式//让该类在外界无法造对象//让外界可以造一个对象,做一个静态方法返回对象//在类里面通过让静态变量控制返回对象只能是一个. 单例模式的要点有三个: 一是某个类只能有一个实例: 二是它必须 ...
- Ubuntu安装Java8和Java9
前言 系统:Ubuntu 16.04 软件: Java8, Java9 Tips: Java 9 的代码由于提供了新特性,所以有些代码并不支持向后兼容.也就是说,用 Java 9 写的代码,有可能在 ...
- checkbox插件
1.全选或者全不选 首先判断全选或全不选checkbox是否被选中. 如果被选中,则为每个选项checkbox设置obj.checked='checked'; 如果未被选中,则为每个选项checkbo ...
- 在WebBrowser控件使用js调用C#方法
有时我们需要在WebBrowser控件中嵌入了网页,然后通过html页面调用后台方法,如何实现呢?其实很简单,主要有三步: 在被调用方法所属的类上加上[ComVisible(true)]标签,意思就是 ...
- 优先队列(存储结构数组)--Java实现
/*优先队列--是对队列的一种改进 *要存储的数据存在优先级--数值小的优先级高--在队头 *优先队列的实现 *1.数组:适合数据量小的情况(没有用rear+front实现) *优先队列头在items ...
- [PGM] Bayes Network and Conditional Independence
2 - 1 - Semantics & Factorization 2 - 2 - Reasoning Patterns 2 - 3 - Flow of Probabilistic Influ ...
- Java基础笔记11
异常: 即java程序在运行时出现的意外情况. java如何处理异常. try{ //可能发生异常的地方 }catch(异常类型 对象){ //异常处理处 }catch(异常类型 对象){ }.. ...
- Element ui表格展示多张图片问题
显示一张图片的方法: <el-table-column label="头像" width="100"> <template scope=&qu ...
- ASP.NET没有魔法——ASP.NET Identity的加密与解密
前面文章介绍了如何使用Identity在ASP.NET MVC中实现用户的注册.登录以及身份验证.这些功能都是与用户信息安全相关的功能,数据安全的重要性永远放在第一位.那么对于注册和登录功能来说要把密 ...