URLClassLoader 学习笔记

原创 2013年12月04日 10:25:36

URLClassLoader是ClassLoader的子类,它用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class到内存中。

 

package hb.classloader;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class URLClassLoaderDemo1 {

	public static void main(String[] args) throws Exception
	{
		try
		{
			Class.forName("org.apache.commons.lang.StringUtils");
		}
		catch(Exception e)
		{
			System.out.println("exception happen!");
			e.printStackTrace();
		}

		File file = new File("c:"+File.separator+"commons-lang-1.0-b1.jar");
		URL url = file.toURI().toURL();
		URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});
		Class clazz = urlClassLoader.loadClass("org.apache.commons.lang.StringUtils");
		Method isEmpty = clazz.getMethod("isEmpty", String.class);

		System.out.println(isEmpty.invoke(null,"This is not empty!"));
		System.out.println(isEmpty.invoke(null,""));
	}

}

 

打印结果:

exception hapen

java.lang.ClassNotFoundException: org.apache.commons.lang.StringUtils

at java.net.URLClassLoader$1.run(Unknown Source)

at java.net.URLClassLoader$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

at java.lang.ClassLoader.loadClass(Unknown Source)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Unknown Source)

at hb.classloader.URLClassLoaderDemo1.main(URLClassLoaderDemo1.java:14)

false

true

 
备注:由于加载org.apache.commons.lang.StringUtils类,在JVM中查找不到,也就是说没有引用相关的jar包,因此会抛出异常。通过URLClassLoader加载相关的jar(里面包含指定的java类),则不会再抛出异常,通过反射获取该类的方法。
 
如果希望上面的代码不抛出异常,可以有两种方法解决:
1、引用commons-lang-1.0-b1.jar
2、在%JRE_HOME%/lib/ext下面添加commons-lang-1.0-b1.jar。
这是因为在App ClassLoader找不到该引用的Class对象就会去找其parent (Extension ClassLoader) ,它就是引用%JRE_HOME%/lib/ext目录下面的所有jar包,如果这里面没有就会继续找其parent(Bootstrap ClassLoader),它的引用在 %JRE_HOME/lib/ 目录下的所有jar,如果这个没有就会报错了

URLClassLoader类

Java为ClassLoader提供了一个URLClassLoader实现类,该类也是系统类加载器和扩展类加载器的父类(此处的父类,就是指类与类之间的继承关系)。URLClassLoader功能比较强...
  • u014470581
  • u014470581
  • 2016年05月09日 19:50
  • 2410

ClassLoader 与 URLClassLoader 的用法

读取配置文件中的信息 配置文件的内容: 用URLClassLoader读配置文件内容: [java] view plaincopyprint? import jav...
  • a454832841
  • a454832841
  • 2014年08月18日 15:40
  • 1247

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
  • 246

利用URLClassLoader加载两个位置的Class

内容:分别位于\myApp\WEB-INF\classes下的类和\webroot下的类,利用URL数组指定多个仓库位置加载。 MyClassLoader: public class MyCl...
  • u011345136
  • u011345136
  • 2015年05月14日 22:54
  • 1069

利用URLClassLoader读取Jar包并反射类(利用Tomcat源码)

第一次写博客,写的不好请见谅。 背景:在公司内部项目中碰到了一个需求,我需要读取本地jar包然后反射其中的实体类来获取其类名、属性等字段并保存。 分析:显然,我们首先需要用到反射,但是反射...
  • opiqi
  • opiqi
  • 2017年07月28日 17:13
  • 216

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

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

找不到 URLClassLoader$1.run() 行: 不可用 的源

tomcat7Server [远程 Java 应用程序] 本地主机 1181 处的 org.apache.catalina.startup.Bootstrap 线程 [main](已暂挂(...
  • yang201610
  • yang201610
  • 2016年10月30日 22:43
  • 497

URLClassloader 例子

自己先写一个test打成jar  复制到当前项目的bin下  test.Son: test里边的类 look:test里边的被调用的方法     package urlClassLoade...
  • shilonggang000
  • shilonggang000
  • 2012年12月19日 10:35
  • 393

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

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

黑马程序员:ClassLoader 与 URLClassLoader 的用法!

---------------------- android培训、java培训、期待与您交流! ----------------------   读取配置文件中的信息 配置文件的内容: ...
  • suiusoar
  • suiusoar
  • 2012年05月03日 10:35
  • 11655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:URLClassLoader 学习笔记
举报原因:
原因补充:

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