Java中类的加载
????? 今天遇到一个奇怪的现象,我把环境变量里的classpath删除掉之后仍然可以执行java程序(path属性没有删除)。
后来终于明白了,这是java的类加载顺序支配的。
????? java虚拟机加载一个类分为以下三种顺序:
????? 1:Bootstrap?? 2:Extension?? 3:Users??
?????
?????一: Bootstrap:在java启动时载入的类,主要是一些重要的jdk的jar文件。比如rt.jar。这个jar文件包含了jdk的一些基础类库,比如我们熟知的java.lang,java.util等等都包含在rt.jar文件里。这个文件是Bootstrap负责加载的,也就是说我们不需要在项目中手动导入这个jar文件,也不需要在classpath里将他添加进去(他的实际目录为%JAVA_HOME%\jre\bin\rt.jar)。所以就可以解释我遇到的那个奇怪的问题了。没有classpath,一些基本的程序还是可以运行的。当然,Bookstrap不止装载rt.jar一个jar文件。要想知道他都加载了哪些类,可以用如下方法打印:System.out.println(System.getProperty("sun.boot.class.path"));。打印结果如下:
public class tet{public static void main(String[] args)throws ClassNotFoundException{ClassLoader loader = Thread.currentThread().getContextClassLoader();Class lo = loader.loadClass("javax.swing.BoxBeanInfo");System.out.println(lo.getClassLoader());}}?
这次我们将在ext目录下的dt.jar文件剪切掉,将他放到%JAVA_HOME%\lib目录下,并且将他设置到classpath环境变量里面。这次我们再打印的话,结果为:sun.misc.Launcher$AppClassLoader@19821f,他的类加载器显然已经变了。这就证明了在classpath里的类是有ApplicationClassLoader加载的,他属于用户自己的类。