参考文献: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 plaincopyprint?
  1. package uRLClassLoaderTest0;
  2. //定义接口ActionInterface
  3. public interface ActionInterface {
  4. public String action();
  5. }

完成后将其打包为testInterface.jar文件。
(2)接下来新建java project:URLClassLoaderTest1,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现ActionInterface接口。如下:

[java] view plaincopyprint?
  1. package uRLClassLoaderTest1;
  2. import uRLClassLoaderTest0.ActionInterface;
  3. //在项目中导入testInterface.jar这个包,实现接口ActionInterface.jar包名不能为类名
  4. public class TestAction implements ActionInterface {
  5. public String action() {
  6. return "this ActionTest class";
  7. }
  8. }

完成后将其打包为test.jar,放在d盘根目录下。下面要做的就是利用URLClassLoader加载并运行TestAction的action方法,并将返回的值打印在控制台上。
(3)新建java project:URLClassLoaderTest2,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:

[java] view plaincopyprint?
  1. package uRLClassLoaderTest2;
  2. import java.net.*;
  3. import java.io.*;
  4. import uRLClassLoaderTest0.ActionInterface;//项目中导入testInterface这个包
  5. public class ClassLoaderTest {
  6. public static void main(String args[]) {
  7. try {
  8. File file = new File("rtest.txt");
  9. BufferedReader in = new BufferedReader(new FileReader(file));
  10. String s = new String();
  11. while ((s = in.readLine()) != null) {
  12. //从rtest.txt中读取的url,根据url创建类装载器
  13. URL url = new URL(s);
  14. s = null;
  15. URLClassLoader myClassLoader = new URLClassLoader(
  16. new URL[] { url }, Thread.currentThread().getContextClassLoader());
  17. System.out.println(myClassLoader);
  18. Class myClass = myClassLoader.loadClass("uRLClassLoaderTest1.TestAction");
  19. ActionInterface action = (ActionInterface) myClass.newInstance();
  20. String str = action.action();
  21. System.out.println(str);
  22. //根据url1创建类装载器
  23. URL url1 = new URL("file:d:/test.jar");
  24. URLClassLoader myClassLoader1 = new URLClassLoader(
  25. new URL[] { url1 }, Thread.currentThread().getContextClassLoader());
  26. Class myClass1 = myClassLoader1.loadClass("uRLClassLoaderTest1.TestAction");
  27. ActionInterface action1 = (ActionInterface) myClass1.newInstance();
  28. String str1 = action1.action();
  29. System.out.println(str1);
  30. }
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }

该代码先在该工程下建立一个文件rtext.txt,用来存储需要加载的jar的路径(路径为:file:d:/Test.jar),实现时,读取一条路径,加载一个

运行结果:

[java] view plaincopyprint?
  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,如需转载请自行联系原作者

URLClassLoader使用方法及事例程序相关推荐

  1. 为什么通过微服务的方法构建应用程序?

    作为软件开发人员,我们已知道思考如何将应用程序因数分解成组件部分. 这是对象导向.软件抽象和组件化的中心模式. 现在,这种因数分解往往以共享库和技术层之间的类与接口呈现. 通常采用一种分层方法,有后端 ...

  2. 复合数值积分方法以及Python程序实现

    ■ 前言 在 Composite Numerical Integration 中给出了三种复合数值积分方法它们分别是: Newton-Cotes Formulas 01三种方法的公式及其Python程 ...

  3. 单片机 10种软件滤波方法的示例程序

    单片机学习笔记_10种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /*  A值可根据实际情况调整     v ...

  4. 计算机启动应用程序的方法,excel的程序_Excel2010中启动应用程序的三种方法

    使用Excel时,需要先启动应用程序,怎么去进行操作启动它?今天,学习啦小编就教大家在Excel2010中启动应用程序的三种方法. Excel2010中启动应用程序的三种步骤如下: 1.开始菜单 在桌 ...

  5. S7-1200循环中断OB30的使用方法及示例程序

    S7-1200循环中断OB30的使用方法及示例程序 OB组织块的类型: 如下表所示,优先级越大,优先级越高 循环中断组织块: 循环中断OB30-OB38以及OB123-OB32767编号的OB. 循环 ...

  6. TIA博途中通过关键字AT实现变量覆盖的具体方法及示例程序

    TIA博途中通过关键字AT实现变量覆盖的具体方法及示例程序 通过关键字 "AT" 可覆盖一个 S7-1200/S7-1500 中已声明的变量. 概述 可以在FB和FC的接口参数区进 ...

  7. 使用main方法启动spring程序

    使用main方法启动spring程序 在 spring 框架中,由于对象都交给了 IoC 容器进行管理,那么直接在 main 方法中创建 service 层对象,就会出现空指针异常(NPE) 正确的方 ...

  8. 多属性决策的权重确定方法及matlab 程序

    本文介绍11种多属性决策权重确定方法及matlab 程序. 1.列和求逆归一化方法(NHM) 1 2.行和归一化方法(NRA) 1 3.和积法(ANC) 1 4.方根法(NGM) 1 5. 特征向量法 ...

  9. 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现多种手机打电话...

    |--需求说明 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现两种手机打电话 |--解题思路 采用简单工 ...

  10. 利用多态特性,编程创建一个手机类Phones,定义打电话方法call()。创建两个子类:苹果手机类IPhone和安卓手机类APhone,并在各自类中重写方法call(),编写程序入口main()方法

    利用多态特性,编程创建一个手机类Phones,定义打电话方法call().创建两个子类:苹果手机类IPhone和安卓手机类APhone,并在各自类中重写方法call(),编写程序入口main()方法, ...

最新文章

  1. js改变classname 或添加classname
  2. Codeforces Round #547 (Div. 3)
  3. listview 每行后面的小箭头_主卧带小衣帽装修,这几个装修方案,你喜欢哪个?...
  4. 在使用apt-get update 时更行列表,显示[Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)]超时
  5. ubuntu配置×××后,配置走×××的路线
  6. c# 拼凑特定格式的报表打印
  7. 一看就懂!卡尔曼滤波通俗解释
  8. ERP项目实施记录09
  9. 【Flutter】基础组件【07】Appbar
  10. 基于IHttpAsyncHandler的TCP收发器
  11. 转:lnmp 搭建手册-黑一路人
  12. AndroidHttpCapture抓包工具
  13. 2018年技术直播PPT干货分享
  14. imp命令导入dmp文件问题
  15. 当前默认服务器维护尚未完成,更新公告 | 7月11日早8点停服维护
  16. eclipse新建java项目隐藏了bin文件夹,只有src文件夹,解决方法
  17. java修改mariadb数据_MariaDB更新数据
  18. 饼图大小调整_PPT制作简约饼图,学会这一个就够了!
  19. Android 框架学习2:源码分析 EventBus 3.0 如何实现事件总线
  20. VMtools的安装教程

热门文章

  1. Flutter AppBar控件
  2. 关系分析可视化插件-Cytoscape
  3. javaScript五种继承方式
  4. C# 删除DataTable中的空行
  5. php-rabbitmq结合rabbitmq_delayed_message_exchange实现延时队列
  6. matlab条形图颜色矩阵,Matlab条形图 – 根据符号和大小填充不同颜色的条形图
  7. uos/deepin设置屏幕缩放比例的命令
  8. 代码整合错了,回滚后再整合,为何要诉苦
  9. No matching configuration of project :libusb was found.
  10. configure: error: no usable zlib; please install zlib devel package or equivalent m