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,如果这个没有就会报错了

相关文章推荐

JDK源码学习(5)-java.lang.ClassLoader与java.net.URLClassLoader学习(有待完善)

java类加载器研究

Selenium API 学习笔记(XMIND版)

  • 2017年11月20日 10:56
  • 1.1MB
  • 下载

oracle 学习笔记

  • 2017年10月31日 14:17
  • 2.77MB
  • 下载

URLClassLoader使用方法及事例程序

首先了解下java几个加载器的基本原理:          Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三...

xamarin学习笔记A18(安卓Service)

  • 2017年11月16日 17:25
  • 204.68MB
  • 下载

URLClassLoader加载类的路径

先看用java命令执行程序的一个例子:        写一个类A.java:

Spark学习笔记

  • 2017年11月06日 17:19
  • 33.09MB
  • 下载

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

1、首先了解下Java几个加载器的基本原理:          Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。系统提供的类加载器主要有下面三...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:URLClassLoader 学习笔记
举报原因:
原因补充:

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