本文转自:http://zhongzhao-2008.iteye.com/blog/201487

初学Java时教科书告诉我们,若要运行Java程序,必需为其设置环境变量。有时候为了实现某种功能(例如动态加载Class)我们需要在程序中来实现这个功能。我们经常使用的Eclipse就是很好的例子,它的所有插件的.jar文件都是放在plugin目录下的,如何加载这些包并使用其中的类成了一个棘手的问题。(关于Eclipse的类加载机制,大家可以参考《Contributing to Eclipse》p54)

下面我们就来看看,在程序中如何实现这个功能。
1、建立一个工程,并为其增加一个 Interface,命名为ActionInterface.java。该接口为使用者公开了一个方法,如下:

程序代码
package org.junesky.classPathTest;
public interface ActionInterface {
    public String action();
}

编译后,将该工程打包为.jar文件。
打包方法:
在包的顶级目录(也就是例子中的org所在的目录)建立一个名为MANIFEST.MF的文件,键入:Manifest-Version: 1.0保存。
在ms-doc窗口中键如命令:jar cvfm classLoader.jar MANIFEST.MF org/
其中classLoader.jar是打包后的文件名,org/是path。

2、建立一个新工程,将classLoader.jar导入,新建class文件MyAction并实现ActionInterface。如下:

程序代码
package org.junesky. MyAction;
import org.junesky.classPathTest. ActionInterface;
public class MyAction implements ActionInterface {
    public String action() {
        // TODO Auto-generated method stub
        return "------------------ok";
    }
}

编译后打包为classTest.jar。

3、新建一工程,将classLoader.jar和classTest.jar导入,新建class文件MyClassLoader.java并继承URLClassLoader。如下:

程序代码
package org.junesky.classPathTest;

import   java.net.URL;
import   java.net.URLClassLoader;

import org.junesky.classPathTest. ActionInterface;

public class ClassPathTest extends URLClassLoader {
    public ClassPathTest(URL url) {
        super(new URL[] { url });
    }

public static Object test(String str , String cls) {
        try {
            URL url = new URL(str);
            ClassPathTest t = new ClassPathTest(url);

Class c = t.findClass(cls);
ActionInterface action = (ActionInterface)c.newInstance();

return action.action();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return "";
    }

public static void main(String[] args) {
        try {
          
            System.out.println(
                ClassPathTest.test("file:D:/JavaTest/ClassTest2/lib/ MyAction.jar",
                        "org.junesky. MyAction. MyAction "));

} catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

编译通过执行,会看到控制台上打印出:
------------------ok

下面我们来看看,这个程序到底做了什么。首先,我们创建了一个接口ActionInterface,在利用URLClassLoader. findClass后,以这个接口创建对象的实例。在第二个jar文件中,我们创建了MyAction.java并实现了ActionInterface,在方法action中我们返回了一个字符串。接下来,我们利用URLClassLoader加载D:/JavaTest/ClassTest2/lib/ MyAction.jar,并以findClass查找并加载org.junesky. MyAction. MyAction类,为得到的Class生成实例:

Class c = t.findClass(cls);  // 加载类
ActionInterface action = (ActionInterface)c.newInstance();  // 生成对象实例

最后调用ActionInterface中声明的action方法打印出MyAction中返回的字符串。

以上代码仅仅是Java Class加载的使用方法的简单说明,在真正开发项目过程序中,往往还需要考虑更多的问题,以后我们再继续说明。

[转]动态加载jar文件相关推荐

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

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

  2. Java动态加载jar及class文件

    经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...

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

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

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

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

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

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

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

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

  7. ExtJS4.x动态加载js文件

    动态加载js文件是ext4.x的一个新特性,可以有效的减少浏览器的压力,提高渲染速度.如动态加载自定义组件 1.在js/extjs/ux目录下,建立自定义组件的js文件. 2.编写MyWindow.j ...

  8. JavaScript动态加载js文件

    /********************************************************************** JavaScript动态加载js文件* 说明:* 之前没 ...

  9. linux 下创建并动态加载.so 文件

    最简单的生成, 动态加载.so 文件的例子 //test.cpp #ifndef _TEST_H    #define _TEST_H       #include <iostream> ...

最新文章

  1. 如何卸载office201032位_微软官方安装卸载修复工具、恶意软件删除工具,了解下!...
  2. 当年嵌入式系统为什么选了Linux,而没有选Windows?
  3. TFIDF的简单解释
  4. 计算机科学与技术python方向是什么意思-大学计算机科学与技术相关专业学习路线...
  5. 四十七、微信小程序开发页面结构WXML
  6. try catch finally 关闭流标准的写法
  7. LeetCode 1246. 删除回文子数组(区间DP)
  8. 几个小时后,我学数据库,找到一些代码
  9. android 自定义域名,Android基于Retrofit2改造的可设置多域名的网络加载框架
  10. UVA10608 Friends【并查集】
  11. 机器学习数学基础(1)-回归、梯度下降
  12. 【译文】人工智能给伦敦带来了它的大脑和经济收益
  13. Mac重装Homebrew
  14. 一个nginx小白的vue项目部署的成功!
  15. coredump 瘦身风云
  16. 计算机字号调整,解答如何调整电脑字体大小
  17. 事后诸葛亮-团队总结
  18. lambda表达式双冒号使用条件_java_java基础_lambda表达式双冒号用法
  19. [转] 用小铲子挖大坑
  20. 单点登录cas常见问题(九) - android app怎么接入cas单点登录系统?

热门文章

  1. 零基础 Amazon Web Services (AWS) 入门教程图文版(三)
  2. 通过谷歌API验证地址是否存在 How Google’s Geocoding solves Address Validation
  3. 如何在手机上安装Ubuntu Touch 13.10
  4. flex states的用法
  5. 动态规划——搬寝室(hdu1421)
  6. curl 常用的命令
  7. Python——有关transpose的多维转置的难点
  8. Vim移动光标快捷键汇总
  9. 笔记 英语二 考研先导课 0126
  10. css外观样式 1204