java动态加载jar包,并运行其中的类和方法

原创 2014年01月07日 16:58:36

动态加载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();
		}
	}

}

第五:运行结果相同。

java程序中动态加载jar包并执行

参考了几篇文章 http://www.cnblogs.com/flyingzl/articles/3139028.html 这个写的比较简单些, 加载jar包的类URLClassLoader中使用的...
  • voiceofwind
  • voiceofwind
  • 2016年07月20日 11:35
  • 5204

java动态加载指定的类或者jar包反射调用其方法

序言        有时候,项目中会用到java动态加载指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大降低,更加的模块化,代码利用率更高。模式中的代理模式就用到java的...
  • chenleixing
  • chenleixing
  • 2015年06月08日 08:50
  • 13175

Java 动态加载jar包

最近在研发一款maven插件一键生成增删改查的插件,需要动态加载 数据库驱动包到内存中import java.io.File; import java.io.IOException; import j...
  • hfmbook
  • hfmbook
  • 2017年05月27日 16:17
  • 607

Java动态加载第三方jar包中的类需要注意的事项

转自:http://bbs.csdn.net/topics/390513691 我现在在一个web系统项目里面定义一个接口interface A,然后将A开放给第三方实现具体的业务。 如:第三方用...
  • xiaoxiaoyusheng2012
  • xiaoxiaoyusheng2012
  • 2016年09月01日 13:47
  • 1470

动态添加jar包并调用jar包里面的方法

假设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现? 在java中,我们的类...
  • lixingshi
  • lixingshi
  • 2016年09月08日 19:17
  • 1366

JAVA动态加载JAR包

动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。 下面通过一个实例来直观演示: 第...
  • m0_37354861
  • m0_37354861
  • 2017年04月21日 10:35
  • 335

Java 动态加载jar文件示例

  • 2015年01月23日 16:12
  • 14KB
  • 下载

Java动态加载jar

通常应用程序都会有很多依赖包,通常的做法是写脚本,在脚本中把依赖包添加到classpath,然后启动主程序。所以本篇纯属调侃,如何在java程序中实现动态加载一个jar,而之后可以自由的使用jar中的...
  • zlyperson
  • zlyperson
  • 2011年11月30日 18:21
  • 1284

Java中动态加载jar文件和class文件

概述   诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类...
  • mousebaby808
  • mousebaby808
  • 2014年06月17日 17:57
  • 29699

JAVA 动态(手动)加载jar文件

//filePath 是jar的绝对路径 URL url = new URL("file:"+filePath);   //里面是一个url的数组,可以同时加载多个 URLClassLoade...
  • kingboy123000
  • kingboy123000
  • 2013年10月23日 16:12
  • 2449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java动态加载jar包,并运行其中的类和方法
举报原因:
原因补充:

(最多只允许输入30个字)