动态加载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. 聚集函数查询结果为空, list的size是1, resolve

    resultList.removeAll(Collections.singleton(null));

  2. 升级cocoapods1.1.1版本

    先切换gem源 gem sources --remove https://rubygems.org/ gem source -a https://gems.ruby-china.org 查看是否切换成 ...

  3. 【struts2】自定义拦截器

    1)什么是自定义的拦截器 所谓自定义的拦截器,就是由我们自己定义并实现的拦截器,而不是由Struts2定义好的拦截器.虽然Struts2的预定义拦截器已经满足了大多数情况的需要.但在有些时候,我们可能 ...

  4. 小而美的ghost driver

    做过selenium自动化项目的同学应该都遇到过这样的问题:测试用例太多,运行速度过慢导致团队成员怨声载道. 于是便有了selenium grid和多线程运行selenium测试用例的方法.这些方法各 ...

  5. CentOS7.2安装pure-ftpd 及其配置项

    CentOS7.2安装FTP(pure-ftpd-1.0.43) 原文链接: https://www.linuxidc.com/Linux/2016-10/135971.htm [日期:2016-10 ...

  6. 验证码识别 图像降噪 算法 Python (二)

    处理器图像: 处理后图像: 代码: from PIL import Image image = Image.open('4.jpg') image = image.convert('L') image ...

  7. win7重命名文件时 提示 “指定的设备名无效”的解决办法

    同事从mac上传一个文件夹到win7上,但是少了一张图片con.jpg.查了半天发现将备份文件改名为con.jpg时提示 “指定的设备名无效”. 谷歌了下,发现了问题所在.坑爹的win7. 从不同的系 ...

  8. 使用mysql innodb 使用5.7的json类型遇到的坑和解决办法

    ---------------------------------------------- #查询JSON的某个字段 select data -> '$.Host' from temp #创建 ...

  9. cocos2d-x 模态对话框的实现

    心情不好,恩.不扯淡了.直接讲. ================================== 在泰然看了一篇实现模态对话框的文章,写的还不错,然后在其基础上加了我简单加了一层灰色透明背景,这 ...

  10. 在eclipse 导入简单的Android studio 简单项目

    前言: 现在Android studio版本已经去到2.0(我暂时用着开发者版本)了,但是还是和以前的版本一样卡. (因为我用了很多第三方的UI控件,导致在Android studio build一个 ...