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

简介: 动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。 下面通过一个实例来直观演示: 第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)   [java] view plain copy     package com.

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

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

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

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.java.loader;  
  2.   
  3. public abstract class AbstractAction {  
  4.     public abstract String action();  
  5. }  

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

 

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.java.jarloader;  
  2.   
  3. import com.java.loader.AbstractAction;  
  4.   
  5. public class TestAction extends AbstractAction{  
  6.     public String action() {  
  7.         System.out.println("I am working ! ");  
  8.         return "this ActionTest class";  
  9.     }  
  10. }  

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

 

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. D:\jarload\test.jar  


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

 

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

 

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


第五:运行结果:

 

这是能完成运行的!

下面我们来改写下:

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

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.java.loader;  
  2.   
  3. public interface InterfaceAction {  
  4.     public String action();  
  5. }  

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

 

 

[java]  view plain  copy
 
 在CODE上查看代码片派生到我的代码片
  1. package com.java.jarloader;  
  2.   
  3. import com.java.loader.InterfaceAction;  
  4.   
  5. public class TestAction implements InterfaceAction{  
  6.   
  7.     @Override  
  8.     public String action() {  
  9.         System.out.println("I am working ! ");  
  10.         return "this ActionTest class";  
  11.     }  
  12.   
  13. }  


第三步相同。

 

第四步:稍作修改 TestMain

 

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


第五:运行结果相同。

 

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

作者:Bonker
出处:http://www.cnblogs.com/Bonker
QQ:519841366
       
本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
目录
相关文章
|
10天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
26 1
|
10天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
22 0
java基础(13)String类
|
3天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
5天前
|
Java API 数据处理
Java 包(package)的作用详解
在 Java 中,包(package)用于组织和管理类与接口,具有多项关键作用:1)系统化组织代码,便于理解和维护;2)提供命名空间,避免类名冲突;3)支持访问控制,如 public、protected、默认和 private,增强封装性;4)提升代码可维护性,实现模块化开发;5)简化导入机制,使代码更简洁;6)促进模块化编程,提高代码重用率;7)管理第三方库,避免命名冲突;8)支持 API 设计,便于功能调用;9)配合自动化构建工具,优化项目管理;10)促进团队协作,明确模块归属。合理运用包能显著提升代码质量和开发效率。
|
5天前
|
Java 数据安全/隐私保护
Java 包(package)的使用详解
Java中的包(`package`)用于组织类和接口,避免类名冲突并控制访问权限,提升代码的可维护性和可重用性。通过`package`关键字定义包,创建相应目录结构即可实现。包可通过`import`语句导入,支持导入具体类或整个包。Java提供多种访问权限修饰符(`public`、`protected`、`default`、`private`),以及丰富的标准库包(如`java.lang`、`java.util`等)。合理的包命名和使用对大型项目的开发至关重要。
|
7天前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
10天前
|
Java
java的class类
java的class类
18 5
|
10天前
|
Java 数据处理
Java Scanner 类详解
`Scanner` 类是 Java 中 `java.util` 包提供的强大工具,用于从多种输入源(如键盘、文件、字符串)读取数据。本文详细介绍如何创建 `Scanner` 对象并使用其常用方法(如 `next()`, `nextInt()`, `nextLine()` 等)。通过示例代码展示如何从标准输入、字符串及文件中读取数据,并进行输入验证。使用时需注意关闭 `Scanner` 以释放资源,并确保输入类型匹配,避免异常。掌握 `Scanner` 可显著提升程序的数据处理能力。
|
3月前
|
Java
[JarEditor]可直接修改jar包的IDEA插件
### 修改JAR包变得更简单:JarEditor插件简介 **背景:** 开发中常需修改JAR包中的class文件,传统方法耗时费力。JarEditor插件让你一键编辑JAR包内文件,无需解压。 **插件使用:** 1. **安装:** 在IDEA插件市场搜索JarEditor并安装。 2. **修改class:** 打开JAR文件中的class,直接编辑,保存后一键构建更新JAR。 3. **文件管理:** 右键菜单支持在JAR内新增/删除/重命名文件等操作。 4. **搜索:** 使用内置搜索功能快速定位JAR包内的字符串。
295 2
[JarEditor]可直接修改jar包的IDEA插件
|
3月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
下一篇
无影云桌面