动态加载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. Go map中一个很重要的特性

    先看一段代码: func main() { m := make(map[int]string) m[1] = "a" m[2] = "b" m[3] = &qu ...

  2. struts2基本配置详解2

    接上篇struts2基本配置详解,还有一些配置没有讲到,下面将继续. struts.xml <package name="com.amos.web.action" names ...

  3. linux达人养成计划学习笔记(三)—— 帮助命令

    一.帮助命令man 1.基本使用方法: man 命令 #获取指定命令的帮助选项: -f 查看命令拥有的帮助级别 相当于whatis,也可以使用whereis来查询 -num 调用对应等级的帮助文件 - ...

  4. c# 4.0 - how to i SMTP with c# 4/.NET 4 to port 465/SSL (...

    first, i've discovered through trial and error that c# 4/.NET 4 has some serious limitations which a ...

  5. .net获取当前url各种属性(文件名、参数、域名、端口等)的方法(转)

    假设当前页完整地址是:http://www.test.com:80/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www ...

  6. python学习笔记——提取网页信息BeautifulSoup4

    1 BeautifulSoup概述 beautifulSoup是勇python语言编写的一个HTML/XML的解析器,它可以很好地处理不规范标记并将其生成剖析树(parse tree): 它提供简单而 ...

  7. 一些实用的php库

    Idiorm – 轻量级ORM库 Snappy – 快照/PDF库 Buzz – 简单的HTTP请求库 Omnipay – 支付处理库 ShellWrap – 优美的命令行包装器

  8. golang学习笔记 ---数组与切片

    数组: golang数组包含的每个数据称为数组元素(element),数组包含的元素个数被称为数组长度(length). golang数组的长度在定义后不可更改,并且在声明时可以是一个常量或常量表达式 ...

  9. Oracle 12C -- plug unplugged PDB into CDB

    connetct to CDB as a common user and verify that pdb_test is closed SQL> select con_id,dbid,name, ...

  10. Oracle 12C -- native left outer join的加强

    在11g中SQL> select count(*)  2    from emp a, dept b, bonus c  3   where a.deptno(+) = b.deptno  4  ...