Java ClassLoader

来源:互联网 发布:豌豆公主app数据 编辑:程序博客网 时间:2024/06/03 18:07

ClassLoader 作用动态的加载class文件到内存中。

Java 默认提供三个ClassLoader

BootStrapClassLoader

最底层的加载器,负责加载JDK中的核心类库,通过程序可以知道它负责加载那些相关的jar或class

URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();  for (int i = 0; i < urls.length; i++) {      System.out.println(urls[i].toExternalForm());  }  或者System.out.println(System.getProperty("sun.boot.class.path").replaceAll(";", "\n"));
输出:C:\jdk1.6.0_30\jre\lib\resources.jarC:\jdk1.6.0_30\jre\lib\rt.jarC:\jdk1.6.0_30\jre\lib\sunrsasign.jarC:\jdk1.6.0_30\jre\lib\jsse.jarC:\jdk1.6.0_30\jre\lib\jce.jarC:\jdk1.6.0_30\jre\lib\charsets.jarC:\jdk1.6.0_30\jre\lib\modules\jdk.boot.jarC:\jdk1.6.0_30\jre\classes

ExtensionClassLoader

加载Java的扩展类,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar.

AppClassLoader

加载应用程序classpath目录下的所有jar和class文件.

Path

  • windows
PATH=%PATH%; C:\Program Files\Java\jdk1.6.0_26\bin
  • Linux
PATH=${PATH}:/home/opt/jdk1.6.0_26/bin

JAVA_HOME
System.getProperty(“java.home”)

  • windows
JAVA_HOME=C:\Program Files\Java\JDK1.6\
  • Linux
JAVA_HOME=/opt/java/jdk_1.6

ClassPath
System.getProperty(“java.class.path”)

  • windows
CLASSPATH=%CLASSPATH%;JAVA_HOME\lib;
  • Linux
CLASSPATH=/home/tester/classes

ClassNotFoundException 和 NoClassDefFoundError

  • 在调用Class.forName() or
    loadClass()方法在运行时动态加载类对象.如果在classpath中没有找到就会抛出ClassNotFoundException
  • 要查找的类在编译的时候是存在的,运行的时候却找不到了,就会抛出 NoClassDefFoundError
    ,如编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误.

注意
除了Java默认提供的三个ClassLoader之外,用户还可以根据需要定义自已的ClassLoader,而这些自定义的ClassLoader都必须继承自java.lang.ClassLoader类,也包括Java提供的另外二个ClassLoader(Extension ClassLoader和App ClassLoader)在内,但是Bootstrap ClassLoader不继承自ClassLoader,因为它不是一个普通的Java类,底层由C++编写,已嵌入到了JVM内核当中,当JVM启动后,Bootstrap ClassLoader也随着启动,负责加载完核心类库后,并构造Extension ClassLoader和App ClassLoader类加载器.

0 0
原创粉丝点击