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

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

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

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

[java] view plain copy

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

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

[java] view plain copy

  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即可,放到指定目录,此处放在

[java] view plain copy

  1. D:\jarload\test.jar

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

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

[java] view plain copy

  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

[java] view plain copy

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

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

[java] view plain copy

  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

[java] view plain copy

  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

时间: 2024-09-28 18:20:29

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

Java动态加载JAR包

参考代码: package org; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.sql.Connection; import java.sql.Driver; import java.util.Properties; public class Test { public static void main(String[] args) throws Exception

动态加载jar包(二)

上次说的加载jar包,有几个问题没有解决: 1.如果项目包含了其他的jar包如何解决? 2.如何规范上传的jar包的类和方法? 下面就解决一下上面两个问题 一.首先编写被调用的类,这次使用maven工程,并且载入了第三方jar包,阿里巴巴的fastjson包 package com.qunar.hello.hello; import java.util.HashMap; import com.alibaba.fastjson.JSON; public class HelloWorld exten

动态加载jar包

一.编写被调用的类 package com.qunar.helloworld; public class HelloWorld { public String sayHello(){ return ("helloworld"); } } 使用eclipse的export功能导出jar包,放在/Users/liqiu/Documents/workspace/HelloWorld.jar 二.编写调用jar包的类 package com.qunar.studyspring.javajar;

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

序言 有时候,项目中会用到java动态加载指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大降低,更加的模块化,代码利用率更高.模式中的代理模式就用到java的这一机制.下边就让我们通过代码来看看如何实现此功能. 代码详细 package loadjarclass; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoad

27 Java动态加载第三方jar包中的类

我加载的方法是://参数fileName是jar包的路径,processorName 是业务类的包名+类名public static A load(String fileName, String processorName) {            String filePath = fileName;              A processor = null;  URL url;try {  url = new URL(filePath);} catch (MalformedURLEx

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

概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 动态加载jar文件 // 系统类库路径 File libPath =

[转载] Java中动态加载jar文件和class文件

转载自http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍

javaEE:day2-servlet生命周期、提交解决中文乱码、tomcat加载jar包或类文件的顺序

servlet生命周期 生命周期简介: servlet在服务器第一次被请求的时候new出来,并初始化(即init())再调用service方法.这个实在服务器中new出来,然后用HashMap加的,与客户端无关.客户端之后访问只调用这个servlet的service方法. 具体分为4步: 1 构造方法 :服务器在被客户端第一次请求的时候运行 仅在服务器中运行一次 2 init方法:客户端第一次访问服务器的时候在服务器中进行初始化 仅一次.并且可以通过config参数在 web.xml中通过(ke

spring加载jar包中多个配置文件(转)

转自:http://evan0625.iteye.com/blog/1598366 在使用spring加载jar包中的配置文件时,不支持通配符,需要一个一个引入,如下所示: Java代码 <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:beanconfigs/applicationContext_1.xml, classpath*: