java动态加载jar包,并运行其中的类和方法
动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。
下面通过一个实例来直观演示:
第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)
- package com.java.loader;
- public abstract class AbstractAction {
- public abstract String action();
- }
第二:写个实体类继承一下 TestAction
- package com.java.jarloader;
- import com.java.loader.AbstractAction;
- public class TestAction extends AbstractAction{
- public String action() {
- System.out.println("I am working ! ");
- return "this ActionTest class";
- }
- }
第三:将TestAction所在的包导出成jar包的方式,eclipse中直接export即可,放到指定目录,此处放在
- D:\jarload\test.jar
放好后,删除TestAction文件和package。
第四:写个main函数测试下 TestMain (这里比较无聊,写了个从文件读的方式获取jar路劲,路径就是上面提到的jar所在的位置)
- package com.java.main;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileReader;
- import java.net.URL;
- import java.net.URLClassLoader;
- import com.java.loader.AbstractAction;
- import com.java.loader.AbstractAction;
- /**
- *
- * 两种方式
- * @author minggang.wumg
- *
- */
- public class TestMain {
- public static void main(String[] args) {
- try {
- //第一种 配置成文件格式
- File file = new File("D:\\jarload\\test.txt");
- BufferedReader in = new BufferedReader(new FileReader(file));
- String s = new String();
- while ((s = in.readLine()) != null) {
- URL url = new URL(s);
- s = null;
- URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
- .getContextClassLoader());
- Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>) myClassLoader.loadClass("com.java.jarloader.TestAction");
- AbstractAction action = (AbstractAction) myClass.newInstance();
- String str = action.action();
- System.out.println(str);
- //第二种
- URL url1 = new URL("file:D:/jarload/test.jar");
- URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
- .getContextClassLoader());
- Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
- AbstractAction action1 = (AbstractAction) myClass1.newInstance();
- String str1 = action1.action();
- System.out.println(str1);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
第五:运行结果:
这是能完成运行的!
下面我们来改写下:
第一:将抽象类改成接口的形式 InterfaceAction
- package com.java.loader;
- public interface InterfaceAction {
- public String action();
- }
第二:改写下实体类,实现接口 TestAction
- package com.java.jarloader;
- import com.java.loader.InterfaceAction;
- public class TestAction implements InterfaceAction{
- @Override
- public String action() {
- System.out.println("I am working ! ");
- return "this ActionTest class";
- }
- }
第三步相同。
第四步:稍作修改 TestMain
- package com.java.main;
- import java.io.BufferedReader;
- import java.io.File;
- import java.io.FileReader;
- import java.net.URL;
- import java.net.URLClassLoader;
- import javax.swing.AbstractAction;
- import com.java.loader.InterfaceAction;
- /**
- *
- * 两种方式
- * @author minggang.wumg
- *
- */
- public class TestMain {
- public static void main(String[] args) {
- try {
- //第一种 配置成文件格式
- File file = new File("D:\\jarload\\test.txt");
- BufferedReader in = new BufferedReader(new FileReader(file));
- String s = new String();
- while ((s = in.readLine()) != null) {
- URL url = new URL(s);
- s = null;
- URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
- .getContextClassLoader());
- Class<?> myClass = (Class<?>) myClassLoader.loadClass("com.java.jarloader.TestAction");
- InterfaceAction action = (InterfaceAction) myClass.newInstance();
- String str = action.action();
- System.out.println(str);
- //第二种
- URL url1 = new URL("file:D:/jarload/test.jar");
- URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
- .getContextClassLoader());
- Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
- InterfaceAction action1 = (InterfaceAction) myClass1.newInstance();
- String str1 = action1.action();
- System.out.println(str1);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
第五:运行结果相同。
转自http://blog.csdn.net/wawmg/article/details/17961815
java动态加载jar包,并运行其中的类和方法的更多相关文章
- JAVA动态加载JAR包的实现
如何动态的加载这些驱动!不可能把所有的数据库驱动都集成到JAR包中吧?!于是动态加载驱动的JAR包就产生了!其实这些在做系统基础代码时,经常用到,只是一般我们没有机会去搞而已. 动态加载JAR包,使用 ...
- Java动态加载JAR包
参考代码: package org; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import ...
- JAVA动态加载JAR包执行程序
入口代码 import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.ne ...
- java动态加载jar文件
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, Invo ...
- tomcat/Java指定加载jar包的路径
背景:部署的web站点,应用默认加载工程的/webapps/工程名/WEB-INF/lib下的jar包 但是我需要提供一个和web工程没关系的的jar包管理目录 解决方法: 执行java方法时 ...
- 动态加载jar包(二)
上次说的加载jar包,有几个问题没有解决: 1.如果项目包含了其他的jar包如何解决? 2.如何规范上传的jar包的类和方法? 下面就解决一下上面两个问题 一.首先编写被调用的类,这次使用maven工 ...
- Java动态加载jar及class文件
经常碰到需要动态加载jar及class文件的场景.Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 一.动态加载ja ...
- 动态加载jar包(一)
一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ( ...
- 深入浅出Android动态加载jar包技术
在实际项目中,由于某些业务频繁变更而导致频繁升级客户端的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路,将核心的易于变更的业务封装在jar包里然后通过网络下载下来,再由 ...
随机推荐
- Git: fatal: Pathspec is in submodule
出现是问题: git提交代码是出现fatal: Path 'directory/file' is in submodule 'directory''错误 Removing the directory ...
- spring 自动装配 default-autowire="byName/byType"
<PRE class=html name="code">spring 自动装配 default-autowire="byName/byType" ...
- Java8 新特性之流式数据处理(转)
转自:https://www.cnblogs.com/shenlanzhizun/p/6027042.html 一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作 ...
- 回到顶部bug
参考自一博客(https://www.cnblogs.com/abao0/p/6642288.html)内有慕课网教程(后发现有bug, 弃置不用了) 以下有问题, 当滚动条处于顶部时, 刷新页面, ...
- Hopfield神经网络和TSP问题
一.TSP问题 旅行商问题,又叫货郎担问题.它是指如下问题:在完全图中寻找一条最短的哈密尔顿回路. 哈密尔顿回路问题:给定一个图,判断图中是否存在哈密尔顿回路. 哈密尔顿回路:寻找一条回路,经过图中所 ...
- 【Struts2】Struts2与Spring整合后,如何指定Action为多例模式
Strust2默认是多例的,但是Spring默认是单例的,在进行Spring+Strust2整合的时候,就需要把Spring管理的action指定为多例模式,只需要在action上面加上@Scope( ...
- Linux安装ElasticSearch与MongoDB分布式集群环境下数据同步
ElasticSearch有一个叫做river的插件式模块,可以将外部数据源中的数据导入elasticsearch并在上面建立索引.River在集群上是单例模式的,它被自动分配到一个节点上,当这个节点 ...
- Oracle 12C -- clone a non-cdb as a pdb
将non-CDB置为只读模式: $ sqlplus '/as sysdba' SQL> select name, decode(cdb, 'YES', 'Multitenant Option e ...
- SQL Server 阻止了对组件 'Agent XPs' 的 过程 'dbo.sp_set_sqlagent_properties' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。
Sqlserver 2008 在配置分发向导的时候报了如下错误: 使用 Agent XPs 选项可以启用此服务器上的 SQL Server 代理扩展存储过程.如果禁用此选项,则 SQL Server ...
- 第2章 Python基础-字符编码&数据类型 列表&元祖 练习题
1.创建一个空列表,命名为names,往里面添加old_driver,rain,jack,shanshan,peiqi,black_girl元素 names = ["old_driver&q ...