URLClassLoader使用方法及事例程序

简介:

参考文献:http://blog.csdn.net/shixin1198/article/details/3733948

1.使用概要:

File file = new File(jar文件全路径); 
URL url = file.toURL(); 
URLClassLoader loader = new URLClassLoader(new URL[] { url }); 
Class tidyClazz = loader.loadClass(所需class的含包名的全名); 

2.详细说明:

我们知道,Java利用ClassLoader将类载入内存,并且在同一应用中,可以有很多个ClassLoader,通过委派机制,把装载的任务传递给上级的装载器的,依次类推,直到启动类装载器(没有上级类装载器)。如果启动类装载器能够装载这个类,那么它会首先装载。如果不能,则往下传递。当父类为null时,JVM内置的类(称为:bootstrap class loader)就会充当父类。想想眼下的越来越多用XML文件做配置文件或者是描述符、部署符。其实这些通过XML文档描述的配置信息最终都要变成Java类,基实都是通过ClassLoader来完成的。URLClassLoader是ClassLoader的子类,它用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class到内存中。
下面来看一个例子,在该例子中,我们要完成的工作是利用URLClassLoader加载jar并运行其中的类的某个方法。
(1)创建java project: URLClassLoaderTest0 ,定义一个接口,使所有继承它的类都必须实现action方法,如下:
[java]  view plain copy print ?
  1. package uRLClassLoaderTest0;  
  2.   
  3. //定义接口ActionInterface  
  4. public interface ActionInterface {  
  5.     public String action();  
  6. }  
完成后将其打包为testInterface.jar文件。
(2)接下来新建java project: URLClassLoaderTest1 ,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现ActionInterface接口。如下:
[java]  view plain copy print ?
  1. package uRLClassLoaderTest1;  
  2.   
  3. import uRLClassLoaderTest0.ActionInterface;  
  4. //在项目中导入testInterface.jar这个包,实现接口ActionInterface.jar包名不能为类名  
  5. public class TestAction implements ActionInterface {  
  6.     public String action() {  
  7.         return "this ActionTest class";  
  8.     }  
  9. }  
完成后将其打包为test.jar,放在d盘根目录下。下面要做的就是利用URLClassLoader加载并运行TestAction的action方法,并将返回的值打印在控制台上。
(3)新建java project: URLClassLoaderTest2 ,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:
[java]  view plain copy print ?
  1. package uRLClassLoaderTest2;  
  2.   
  3. import java.net.*;  
  4. import java.io.*;  
  5. import uRLClassLoaderTest0.ActionInterface;//项目中导入testInterface这个包  
  6.   
  7. public class ClassLoaderTest {  
  8.     public static void main(String args[]) {  
  9.         try {  
  10.             File file = new File("rtest.txt");  
  11.             BufferedReader in = new BufferedReader(new FileReader(file));  
  12.             String s = new String();  
  13.             while ((s = in.readLine()) != null) {  
  14.                 //从rtest.txt中读取的url,根据url创建类装载器  
  15.                 URL url = new URL(s);  
  16.                 s = null;  
  17.                 URLClassLoader myClassLoader = new URLClassLoader(  
  18.                         new URL[] { url }, Thread.currentThread().getContextClassLoader());  
  19.                 System.out.println(myClassLoader);  
  20.                 Class myClass = myClassLoader.loadClass("uRLClassLoaderTest1.TestAction");  
  21.                 ActionInterface action = (ActionInterface) myClass.newInstance();  
  22.                 String str = action.action();  
  23.                 System.out.println(str);  
  24.                   
  25.                 //根据url1创建类装载器  
  26.                 URL url1 = new URL("file:d:/test.jar");  
  27.                 URLClassLoader myClassLoader1 = new URLClassLoader(  
  28.                         new URL[] { url1 }, Thread.currentThread().getContextClassLoader());  
  29.                 Class myClass1 = myClassLoader1.loadClass("uRLClassLoaderTest1.TestAction");  
  30.                 ActionInterface action1 = (ActionInterface) myClass1.newInstance();  
  31.                 String str1 = action1.action();  
  32.                 System.out.println(str1);  
  33.                   
  34.             }  
  35.         } catch (Exception e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.     }  
  39.   
  40. }  
该代码先在该工程下建立一个文件 rtext.txt ,用来存储需要加载的jar的路径 (路径为:file:d:/Test.jar) ,实现时,读取一条路径,加载一个

运行结果:

[java]  view plain copy print ?
  1. java.net.URLClassLoader@152b6651  
  2. this ActionTest class  
  3. this ActionTest class  
注意点:

前面打包的jar包的名字不能跟类名相同,比如不能起名为TestAction.jar和ActionInterface.jar


本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/12/05/2296918.html,如需转载请自行联系原作者

目录
相关文章
|
12月前
|
人工智能 Java API
阿里云开源 AI 应用开发框架:Spring AI Alibaba
近期,阿里云重磅发布了首款面向 Java 开发者的开源 AI 应用开发框架:Spring AI Alibaba(项目 Github 仓库地址:alibaba/spring-ai-alibaba),Spring AI Alibaba 项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。本文将详细介绍 Spring AI Alibaba 的核心特性,并通过「智能机票助手」的示例直观的展示 Spring AI Alibaba 开发 AI 应用的便利性。示例源
8114 132
|
Java API Android开发
ASM 框架:字节码操作的常见用法(生成类,修改类,方法插桩,方法注入)
ASM 框架:字节码操作的常见用法(生成类,修改类,方法插桩,方法注入)
474 0
|
运维 监控 算法
JDK 21中的分代ZGC:内存管理的革命性进步
本文深入探讨了JDK 21中引入的分代ZGC(Z Garbage Collector)的工作原理、特性及其对现代应用程序性能的影响。分代ZGC是一种基于分代收集的垃圾回收器,通过优化内存分配和回收过程,实现了更高的吞吐量和更低的延迟。本文将分析分代ZGC的设计哲学、技术细节以及在实际应用中的优势,并展示如何通过配置和优化分代ZGC来提升Java应用程序的性能。
1407 7
|
Java 中间件 Maven
如何实现Java类隔离加载?
Java 开发中,如果不同的 jar 包依赖了某些通用 jar 包的版本不一样,运行时就会因为加载的类跟预期不符合导致报错。如何避免这种情况呢?本文通过分析 jar 包产生冲突的原因及类隔离的实现原理,分享两种实现自定义类加载器的方法。
如何实现Java类隔离加载?
|
SQL JSON 数据格式
ES中如何实现空值和非空值的查询
ES中如何实现空值和非空值的查询
5191 0
|
SQL JSON 关系型数据库
JSON_TABLE 两全其美
在这篇博客文章中,我将向您展示如何做到这一点,并讨论JSON_TABLE如何启用使用SQL处理JSON数据的新方法。
8321 0
|
缓存 Java Apache
七大主流的HttpClient程序比较
七大主流的HttpClient程序比较
|
安全 Java jenkins
Java | ProGuard——java代码混淆利器
Java | ProGuard——java代码混淆利器
5040 0
Java | ProGuard——java代码混淆利器
|
存储 数据库
elasticsearch 主键生成策略以及如何指定特定字段为id主键列
elasticsearch 主键生成策略以及如何指定特定字段为id主键列
1149 0
|
缓存 前端开发 安全
深入理解Java类加载器(ClassLoader)
深入理解Java类加载器(ClassLoader)
1070 0