动态加载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. <转>字节码指令

    本文转自:http://www.cnblogs.com/nazhizq/p/6525263.html 在llimits.h文件中定义了指令的类型.其实就是32个字节. typedef lu_int32 ...

  2. ctrl+shift+i eclipse快捷键,debug时显示全黑屏

    ctrl+shift+i eclipse快捷键,debug时显示全黑屏,这样方便进行查看内容.

  3. Java多线程编程:Callable、Future和FutureTask浅析

    通过前面几篇的学习,我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结 ...

  4. HDU 4324 Triangle LOVE (拓扑排序)

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  5. MongoDB资料汇总专题

    原文地址:http://bbs.chinaunix.net/thread-3675396-1-1.html 上一篇Redis资料汇总专题很受大家欢迎,这里将MongoDB的系列资料也进行了简单整理.希 ...

  6. Android 获取包名,版本信息

    Android 获取包名,版本信息及VersionName名称     <span style="font-size: 14px;">private String ge ...

  7. Python读文本文件

    file_object = open('thefile.txt') try: all_the_text = file_object.read() finally: file_object.close( ...

  8. TCP握手和传输的一次观察

    1. TCP三次握手SYN ---> <--- SYN,ACKACK ---> 花费时间:386.718-385.784=0.934ms 2.正常的消息交互2.1. 服务器主动校验 ...

  9. proguard的简单配置说明

    #需要转换的jar文件路径-injars 'D:\fs-np.jar'#转换后的jar文件名称-outjars 'D:\fs-np-sec.jar' #关联的第三方jar-libraryjars 'C ...

  10. cygwin完全安装步骤方法(过程图解)

    cygwin完全安装步骤方法(过程图解) 我们可以到Cygwin的官方网站下载Cygwin的安装程序,地址是: http://www.cygwin.com/ 或者直接使用下载连接来下载安装程序,下载连 ...