动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。

下面通过一个实例来直观演示:

第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)

  1. package com.java.loader;
  2. public abstract class AbstractAction {
  3. public abstract String action();
  4. }

第二:写个实体类继承一下 TestAction

  1. package com.java.jarloader;
  2. import com.java.loader.AbstractAction;
  3. public class TestAction extends AbstractAction{
  4. public String action() {
  5. System.out.println("I am working ! ");
  6. return "this ActionTest class";
  7. }
  8. }

第三:将TestAction所在的包导出成jar包的方式,eclipse中直接export即可,放到指定目录,此处放在

  1. D:\jarload\test.jar

放好后,删除TestAction文件和package。

第四:写个main函数测试下 TestMain (这里比较无聊,写了个从文件读的方式获取jar路劲,路径就是上面提到的jar所在的位置)

  1. package com.java.main;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.net.URL;
  6. import java.net.URLClassLoader;
  7. import com.java.loader.AbstractAction;
  8. import com.java.loader.AbstractAction;
  9. /**
  10. *
  11. * 两种方式
  12. * @author minggang.wumg
  13. *
  14. */
  15. public class TestMain {
  16. public static void main(String[] args) {
  17. try {
  18. //第一种  配置成文件格式
  19. File file = new File("D:\\jarload\\test.txt");
  20. BufferedReader in = new BufferedReader(new FileReader(file));
  21. String s = new String();
  22. while ((s = in.readLine()) != null) {
  23. URL url = new URL(s);
  24. s = null;
  25. URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
  26. .getContextClassLoader());
  27. Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>) myClassLoader.loadClass("com.java.jarloader.TestAction");
  28. AbstractAction action = (AbstractAction) myClass.newInstance();
  29. String str = action.action();
  30. System.out.println(str);
  31. //第二种
  32. URL url1 = new URL("file:D:/jarload/test.jar");
  33. URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
  34. .getContextClassLoader());
  35. Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
  36. AbstractAction action1 = (AbstractAction) myClass1.newInstance();
  37. String str1 = action1.action();
  38. System.out.println(str1);
  39. }
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }

第五:运行结果:

这是能完成运行的!

下面我们来改写下:

第一:将抽象类改成接口的形式  InterfaceAction

  1. package com.java.loader;
  2. public interface InterfaceAction {
  3. public String action();
  4. }

第二:改写下实体类,实现接口 TestAction

  1. package com.java.jarloader;
  2. import com.java.loader.InterfaceAction;
  3. public class TestAction implements InterfaceAction{
  4. @Override
  5. public String action() {
  6. System.out.println("I am working ! ");
  7. return "this ActionTest class";
  8. }
  9. }

第三步相同。

第四步:稍作修改 TestMain

  1. package com.java.main;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.net.URL;
  6. import java.net.URLClassLoader;
  7. import javax.swing.AbstractAction;
  8. import com.java.loader.InterfaceAction;
  9. /**
  10. *
  11. * 两种方式
  12. * @author minggang.wumg
  13. *
  14. */
  15. public class TestMain {
  16. public static void main(String[] args) {
  17. try {
  18. //第一种  配置成文件格式
  19. File file = new File("D:\\jarload\\test.txt");
  20. BufferedReader in = new BufferedReader(new FileReader(file));
  21. String s = new String();
  22. while ((s = in.readLine()) != null) {
  23. URL url = new URL(s);
  24. s = null;
  25. URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
  26. .getContextClassLoader());
  27. Class<?> myClass = (Class<?>) myClassLoader.loadClass("com.java.jarloader.TestAction");
  28. InterfaceAction action = (InterfaceAction) myClass.newInstance();
  29. String str = action.action();
  30. System.out.println(str);
  31. //第二种
  32. URL url1 = new URL("file:D:/jarload/test.jar");
  33. URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
  34. .getContextClassLoader());
  35. Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
  36. InterfaceAction action1 = (InterfaceAction) myClass1.newInstance();
  37. String str1 = action1.action();
  38. System.out.println(str1);
  39. }
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }

第五:运行结果相同。

转自http://blog.csdn.net/wawmg/article/details/17961815

java动态加载jar包,并运行其中的类和方法的更多相关文章

  1. JAVA动态加载JAR包的实现

    如何动态的加载这些驱动!不可能把所有的数据库驱动都集成到JAR包中吧?!于是动态加载驱动的JAR包就产生了!其实这些在做系统基础代码时,经常用到,只是一般我们没有机会去搞而已. 动态加载JAR包,使用 ...

  2. Java动态加载JAR包

    参考代码: package org; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import ...

  3. JAVA动态加载JAR包执行程序

    入口代码 import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.ne ...

  4. java动态加载jar文件

    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, Invo ...

  5. tomcat/Java指定加载jar包的路径

    背景:部署的web站点,应用默认加载工程的/webapps/工程名/WEB-INF/lib下的jar包   但是我需要提供一个和web工程没关系的的jar包管理目录   解决方法: 执行java方法时 ...

  6. 动态加载jar包(二)

    上次说的加载jar包,有几个问题没有解决: 1.如果项目包含了其他的jar包如何解决? 2.如何规范上传的jar包的类和方法? 下面就解决一下上面两个问题 一.首先编写被调用的类,这次使用maven工 ...

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

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

  8. 动态加载jar包(一)

    一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ( ...

  9. 深入浅出Android动态加载jar包技术

    在实际项目中,由于某些业务频繁变更而导致频繁升级客户端的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路,将核心的易于变更的业务封装在jar包里然后通过网络下载下来,再由 ...

随机推荐

  1. xshell连接centos vi编辑器不能使用小键盘

    莫名其妙的本人的xshell,在vim编辑脚本的时候,右侧小键盘无法输出数字,输出的都是一些字母,而且还是一个字母占一行,太过艹蛋! 后来就按照正规的操作步骤,又重建了连接,居然发现正常了! 百思一虑 ...

  2. [转]nonlocal和global

    在Python中,当引用一个变量的时候,对这个变量的搜索是按找本地作用域(Local).嵌套作用域(Enclosing function locals).全局作用域(Global).内置作用域(bui ...

  3. 进阶之路(基础篇) - 021 arduino基础知识

    什么是arduino(翻译自arduino官方介绍)Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).她适用于艺术家. ...

  4. android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法

    今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化.最后发现原因是 ListView滚 ...

  5. 【Oracle】Oracle约束的总结

    你对ORACLE约束的了解如何?比较模糊还是相当透彻?如果你对下面几个问题了如指掌的话,恭喜你,你已经对约束掌握得比较好了,不用看这篇文章了.ORACLE的约束有啥功能作用? 有哪些类型约束(不同版本 ...

  6. [AaronYang]C#人爱学不学[1]

    当前编写时间:2014年12月24日21:11:14   编写人:杨洋(Aaronyang) 新文章:[AaronYang]C#人爱学不学[1] 声明:->可以理解为 联想到,或者关联的意思. ...

  7. WPF:“wpf类库项目改为Window应用程序项目”系列问题

    一.wpf类库项目改为Window应用程序项目1.错误 CS5001 Program does not contain a static 'Main' method suitable for an e ...

  8. pingback协议与traceback协议的区别

    wordpress 的 pingback协议与traceback协议区别

  9. [golang] Glide 包管理

    一.概述 golang的包管理工具有很多,本篇幅主要介绍glide进行包管理. 二.安装及命令介绍 go get github.com/Masterminds/glide glide create|i ...

  10. Jmeter 线程组、运行次数参数化

    Jmeter的jmx文件保存了线程数和运行次数等参数,这个参数可以在命令行中传入参数的方式来修改数值 步骤如下 1.生成线程和运行次数的参数 Jmeter选项中函数助手对话框,选中__P参数,这个参数 ...