URLClassLoader使用方法及事例程序
来源:互联网 发布:java从业人员发展方向 编辑:程序博客网 时间:2024/04/30 03:45
首先了解下java几个加载器的基本原理:
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求。
我们平时程序执行的时候在类加载器中寻找类的结构的顺序是:引导类加载器-》 扩展类加载器-》系统类加载器-》我们自定义的一些类加载器,每个类加载器都有自己的空间,同一个加载器里面的类的二进制名字必须是唯一的,当然同一个类也可以存在不同的加载器内存区域里面,不过我们寻找类的时候是按顺序找的,一但找的也就不会继续往下找了,最终也没找到就会报类不存在异常。
URL url = file.toURL();
URLClassLoader loader = new URLClassLoader(new URL[] { url });
Class tidyClazz = loader.loadClass(所需class的含包名的全名);
下面来看一个例子,在该例子中,我们要完成的工作是利用URLClassLoader加载jar并运行其中的类的某个方法。
(1)创建java project:URLClassLoaderTest0,定义一个接口,使所有继承它的类都必须实现action方法,如下:
完成后将其打包为testInterface.jar文件。
(2)接下来新建java project:URLClassLoaderTest1,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现ActionInterface接口。如下:
完成后将其打包为test.jar,放在d盘根目录下。下面要做的就是利用URLClassLoader加载并运行TestAction的action方法,并将返回的值打印在控制台上。
(3)新建java project:URLClassLoaderTest2,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:
该代码先在该工程下建立一个文件rtext.txt,用来存储需要加载的jar的路径(路径为:file:d:/Test.jar),实现时,读取一条路径,加载一个
注意点:
Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三个:
引导类加载器(bootstrap class loader):它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.lang.ClassLoader。
扩展类加载器(extensions class loader):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。
系统类加载器(system class loader):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。
除了系统提供的类加载器以外,开发人员可以通过继承 java.lang.ClassLoader 类的方式实现自己的类加载器,以满足一些特殊的需求。
我们平时程序执行的时候在类加载器中寻找类的结构的顺序是:引导类加载器-》 扩展类加载器-》系统类加载器-》我们自定义的一些类加载器,每个类加载器都有自己的空间,同一个加载器里面的类的二进制名字必须是唯一的,当然同一个类也可以存在不同的加载器内存区域里面,不过我们寻找类的时候是按顺序找的,一但找的也就不会继续往下找了,最终也没找到就会报类不存在异常。
我们如果想动态加载类的话就要仿照我们用的服务器如tomcat和weblogic之类的,他们的开发模式也就是把所有的类都加载到自身的类加载器中,当文件被替换的时候他们就重新加载新的class到内存里面去,从而实现了类的动态加载。
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方法,如下:
- package uRLClassLoaderTest0;
- //定义接口ActionInterface
- public interface ActionInterface {
- public String action();
- }
(2)接下来新建java project:URLClassLoaderTest1,为了编译通过,引入之前打好的testInterface.jar包。并创建TestAction类,使它实现ActionInterface接口。如下:
- package uRLClassLoaderTest1;
- import uRLClassLoaderTest0.ActionInterface;
- //在项目中导入testInterface.jar这个包,实现接口ActionInterface.jar包名不能为类名
- public class TestAction implements ActionInterface {
- public String action() {
- return "this ActionTest class";
- }
- }
(3)新建java project:URLClassLoaderTest2,引入testInterface.jar包。并创建一可执行类(main方法),在其中加入如下代码:
- package uRLClassLoaderTest2;
- import java.net.*;
- import java.io.*;
- import uRLClassLoaderTest0.ActionInterface;//项目中导入testInterface这个包
- public class ClassLoaderTest {
- public static void main(String args[]) {
- try {
- File file = new File("rtest.txt");
- BufferedReader in = new BufferedReader(new FileReader(file));
- String s = new String();
- while ((s = in.readLine()) != null) {
- //从rtest.txt中读取的url,根据url创建类装载器
- URL url = new URL(s);
- s = null;
- URLClassLoader myClassLoader = new URLClassLoader(
- new URL[] { url }, Thread.currentThread().getContextClassLoader());
- System.out.println(myClassLoader);
- Class myClass = myClassLoader.loadClass("uRLClassLoaderTest1.TestAction");
- ActionInterface action = (ActionInterface) myClass.newInstance();
- String str = action.action();
- System.out.println(str);
- //根据url1创建类装载器
- URL url1 = new URL("file:d:/test.jar");
- URLClassLoader myClassLoader1 = new URLClassLoader(
- new URL[] { url1 }, Thread.currentThread().getContextClassLoader());
- Class myClass1 = myClassLoader1.loadClass("uRLClassLoaderTest1.TestAction");
- ActionInterface action1 = (ActionInterface) myClass1.newInstance();
- String str1 = action1.action();
- System.out.println(str1);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
运行结果:
- java.net.URLClassLoader@152b6651
- this ActionTest class
- this ActionTest class
前面打包的jar包的名字不能跟类名相同,比如不能起名为TestAction.jar和ActionInterface.jar
0 0
- URLClassLoader使用方法及事例程序
- URLClassLoader使用方法及事例程序
- URLClassLoader使用方法及事例程序
- URLClassLoader使用方法及事例程序
- URLClassLoader使用方法及事例程序
- URLClassLoader使用方法及事例程序
- URLClassLoader使用方法和实例
- URLClassLoader使用方法和实例
- URLClassLoader使用方法和实例
- URLClassLoader使用方法和实例
- java URLClassLoader使用方法和实例
- URLClassLoader
- URLClassLoader
- URLClassLoader
- URLClassLoader
- URLClassLoader
- URLClassLoader使用方法和实例 类加载器
- guestbook事例程序详解
- 一个频繁刷新内容的textview
- 使用ToolRunner运行Hadoop程序基本原理分析
- 欢迎使用CSDN-markdown编辑器
- 在html中使用fontIcon 的图标
- iOS学习_Lesson01_数据结构
- URLClassLoader使用方法及事例程序
- springmvc+easyui 数据显示
- Android Studio中SVN相关
- Android 使用ORMLite 操作数据库
- 上传代码到Github
- Linux添加自定义命令方法
- 快速对Mysql添加索引的五个方法
- C# 3D到2D投射
- json