Java虚拟机类加载器及URLClassLoader应用

转载 2013年12月03日 16:58:11

Java虚拟机中定义了一个类装载器子系统和执行引擎子系统.其中类装载器子系统主要是负责装载类二进制文件到JVM中的,而执行引擎子系统则负责执行其中的指令.二者都是虚拟机的具体实现,执行引擎程序代码中无法控制,相对来说类装载器就比较灵活.JVM规范中定义虚拟机必须实现启动类装载器(bootstarp),但是用户可以定义自己的类装载器.一个程序启动的时候有3个类加载器.

第一个是启动类加载器,它负责加载Java的核心类.它是JVM实现的一部分,不是ClassLoader的子类.是用C代码实现的.第二个类加载器是扩展类加载器,它负责加载JDK的扩展类,也就是目录配置属性.第三个是APP的类加载器,通常用ClassLoader.getSystemClassLoader()可以获得,负责加载CLASSPATH下的类.一般这3个类加载器足以满足我们的应用.虽然假如我们的程序需要加载上述3个加载器不能到达类.那么我们就只能定义自己的类加载器.

  1. public static void main(String[] args) throws Exception  
  2. {  
  3.     try  
  4.     {  
  5.         Class.forName("org.apache.commons.lang.StringUtils");  
  6.     }  
  7.     catch(Exception e)  
  8.     {  
  9.         e.printStackTrace();  
  10.     }  
  11.   
  12.     File file = new File("D:"+File.separator+"commons-lang-2.5.jar");  
  13.     URL url = file.toURI().toURL();  
  14.     URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});  
  15.     Class clazz = urlClassLoader.loadClass("org.apache.commons.lang.StringUtils");  
  16.     Method isEmpty = clazz.getMethod("isEmpty", String.class);  
  17.   
  18.     System.out.println(isEmpty.invoke(null,"This is not empty!"));  
  19.     System.out.println(isEmpty.invoke(null,""));  
  20. }  

假设在D盘放置了一个apache的commons-lang包,想调用其中的方法,但是我们没有把他引入到classpath.所以在上述的3个ClassLoader中根本就找不到该类的存在.如上述代码用Class.forName方法加载类,此时使用的是AppClassLoader,它的上层ClassLoader也没有该类的引用.所以自然会报出java.lang.ClassNotFoundException的异常出来.所以我们必须定义自己的ClassLoader去加载它,这时候URLClassLoader 就派上用场了.它接受一个URL数组为参数,代表的意义是它可以在提供的路径中加载到提供的类.于是上述代码就可以使用loadClass来加载返回一个Class对象.然后用java反射来调用加载的类的方法.上述代码是调用了org.apache.commons.lang.StringUtils的静态方法isEmpty.

在WEB容器的实现中也用了此方法.有兴趣的话可以参考下Tomcat的源码.容器启动的时候Bootstrap在设置完基本的目录之后,第一件事就是先调用initClassLoaders来构造自己的类加载器层次.

URLClassLoader使用方法和实例

使用概要:   File   file   =   new   File(jar文件全路径);      URL   url   =   file.toURL();      URLClas...
  • mycomputerxiaomei
  • mycomputerxiaomei
  • 2014年04月25日 14:37
  • 25538

URLClassLoader会“挂住”所有它已经打开了的在classpath上的文件

import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java...
  • xiaomin1991222
  • xiaomin1991222
  • 2016年03月10日 16:05
  • 232

Java通过URLClassLoader让程序支持插件扩展

插件(Plugin)是什么不用多说。常用的软件,例如Eclipse、Photoshop、VisualStudio,都支持插件扩展。插件可以动态给软件添加一些功能,也可以随时删除,这样的好处是任何人都可...
  • lipei1220
  • lipei1220
  • 2017年01月12日 19:08
  • 578

URLClassLoader使用方法和实例 类加载器

1、首先了解下Java几个加载器的基本原理:          Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三...
  • chen846262292
  • chen846262292
  • 2016年10月15日 13:45
  • 830

运用URLClassLoader加载外部jar包的java类,生成Class文件

先来一段网上copy的话术:       //**************************** 很多时候 我们写的java程序是分模块的,有很好的扩展机制,即我们可以为我们自己的j...
  • ystyaoshengting
  • ystyaoshengting
  • 2016年02月19日 16:22
  • 550

通过URLClassLoader实现动态加载jar文件

Java代码   package t;      import java.net.URL;   import java.net.URLClassLoader;   import ja...
  • xiaomin1991222
  • xiaomin1991222
  • 2016年03月10日 16:05
  • 308

一看你就懂,超详细java中的ClassLoader详解

ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。理解ClassLoader的加载机制,也有利于我们编写出更高效的代码。ClassLo...
  • briblue
  • briblue
  • 2017年02月10日 19:26
  • 40268

MAVEN WEB 项目运行异常记录001

在构建maven web项目时,启动tomcat正常,但是访问项目时报错,tomcat版本为apache-tomcat-8.0.14,错误如下: 30-Apr-2017 16:53:09.1...
  • u011244682
  • u011244682
  • 2017年04月30日 23:51
  • 149

利用classloader动态加载jar包

利用classloader动态加载jar包
  • zsllxbb
  • zsllxbb
  • 2015年11月18日 09:47
  • 1881

JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

简单介绍JAVA虚拟机,安卓Dalvik虚拟机和ART虚拟机,并做简单对比。
  • jason0539
  • jason0539
  • 2015年12月31日 11:43
  • 14704
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java虚拟机类加载器及URLClassLoader应用
举报原因:
原因补充:

(最多只允许输入30个字)