URLClassLoader 加载类

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

Java代码 

 收藏代码

  1. package hb.classloader;  
  2.   
  3. import java.io.File;  
  4. import java.lang.reflect.Method;  
  5. import java.net.URL;  
  6. import java.net.URLClassLoader;  
  7.   
  8. public class URLClassLoaderDemo1 {  
  9.   
  10.     public static void main(String[] args) throws Exception  
  11.     {  
  12.         try  
  13.         {  
  14.             Class.forName("org.apache.commons.lang.StringUtils");  
  15.         }  
  16.         catch(Exception e)  
  17.         {  
  18.             System.out.println("exception happen!");  
  19.             e.printStackTrace();  
  20.         }  
  21.   
  22.         File file = new File("c:"+File.separator+"commons-lang-1.0-b1.jar");  
  23.         URL url = file.toURI().toURL();  
  24.         URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{url});  
  25.         Class clazz = urlClassLoader.loadClass("org.apache.commons.lang.StringUtils");  
  26.         Method isEmpty = clazz.getMethod("isEmpty", String.class);  
  27.   
  28.         System.out.println(isEmpty.invoke(null,"This is not empty!"));  
  29.         System.out.println(isEmpty.invoke(null,""));  
  30.     }  
  31.   
  32. }  

打印结果:

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

猜你喜欢

转载自blog.csdn.net/hanjungua8144/article/details/81624887