[转]动态加载jar文件
本文转自: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文件相关推荐
- java动态加载jar文件并执行方法
在项目开发的过程中,有时候需要动态灵活的加载某个jar包并执行里面的方法的时候,我们可以使用本篇文章写得方式去动态的加载jar包而不用使用原始方式引入jar包作为lib去使用,接下来介绍如何动态加载j ...
- Java动态加载jar及class文件
经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...
- android动态jar,Android动态加载Jar(包含第三方依赖Jar)
最近项目有一个需求,需要根据用户需求动态加载APP内某功能模块,且当该部分功能模块代码有变动,只需更新该功能JAR,无需更新整个APK,基于这个需求,决定采用动态加载Jar的方式去实现,于是各种查资料 ...
- [转]Android动态加载jar/dex
本文转自:http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html 前言 在目前的软硬件环境下,Native App与Web App ...
- flink sql udf jar包_Java动态加载Jar实例解析
导读:在实际项目开发中,有时会遇到需动态加载jar包的应用场景.如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用.下面将举一个简 ...
- java动态加载jar时,jar中还有第三方jar无法加载的解决方法
java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...
- ExtJS4.x动态加载js文件
动态加载js文件是ext4.x的一个新特性,可以有效的减少浏览器的压力,提高渲染速度.如动态加载自定义组件 1.在js/extjs/ux目录下,建立自定义组件的js文件. 2.编写MyWindow.j ...
- JavaScript动态加载js文件
/********************************************************************** JavaScript动态加载js文件* 说明:* 之前没 ...
- linux 下创建并动态加载.so 文件
最简单的生成, 动态加载.so 文件的例子 //test.cpp #ifndef _TEST_H #define _TEST_H #include <iostream> ...
最新文章
- 如何卸载office201032位_微软官方安装卸载修复工具、恶意软件删除工具,了解下!...
- 当年嵌入式系统为什么选了Linux,而没有选Windows?
- TFIDF的简单解释
- 计算机科学与技术python方向是什么意思-大学计算机科学与技术相关专业学习路线...
- 四十七、微信小程序开发页面结构WXML
- try catch finally 关闭流标准的写法
- LeetCode 1246. 删除回文子数组(区间DP)
- 几个小时后,我学数据库,找到一些代码
- android 自定义域名,Android基于Retrofit2改造的可设置多域名的网络加载框架
- UVA10608 Friends【并查集】
- 机器学习数学基础(1)-回归、梯度下降
- 【译文】人工智能给伦敦带来了它的大脑和经济收益
- Mac重装Homebrew
- 一个nginx小白的vue项目部署的成功!
- coredump 瘦身风云
- 计算机字号调整,解答如何调整电脑字体大小
- 事后诸葛亮-团队总结
- lambda表达式双冒号使用条件_java_java基础_lambda表达式双冒号用法
- [转] 用小铲子挖大坑
- 单点登录cas常见问题(九) - android app怎么接入cas单点登录系统?