关于Java类加载

1.了解类加载的意义

类加载是Java程序运行的第一步,研究类加载有助于: 1) 了解JVM的执行过程,指导开发者采取更有效的措施配合程序的执行。 2) 让程序能动态控制类加载。

2.类加载的一般过程

java程序运行的场所是内存,当执行java HelloWorld命令时,JVM会自动将HelloWorld.class文件加载到内存中,并形成一个class的对象HelloWorld.class。 其中的类加载过程如下: 1)、寻找JRE目录,找到jvm.dll,并初始化JVM。 2)、产生一个Bootstrap Loader(启动类加载器)。 附加说明: Bootstrap Loader加载System.getProperty(“sun.boot.class.path”)所指定的路径或jar。 3)、Bootstrap Loader自动加载Extented Loader(扩展类加载器),并将其父加载器设置为Bootstrap Loader。 附加说明: Extented Loader加载System.getProperty(“java.ext.dirs”)所指定的路径或jar。在使用Java运行程序时,也可以指定其搜索路径,例如:java -Djava.ext.dirs=d:\projects\testproj\classes HelloWorld。 4)、Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父加载器设置为Extented Loader。 附加说明: AppClass Loader加载System.getProperty(“java.class.path”)所指定的路径或jar。在使用Java运行程序时,也可以加上-cp来覆盖原有的Classpath设置,例如: java -cp ./lavasoft/classes HelloWorld 5)、最后由 AppClass Loader加载HelloWorld类。 附加说明: ExtClassLoader和AppClassLoader在JVM启动后,会在JVM中保存一份,并且在程序运行中无法改变其搜索路径。如果想在运行时从其他搜索路径加载类,就要产生新的类加载器。

3.类加载器的特点

1)、运行一个程序时,总是由AppClass Loader(系统类加载器)开始加载指定的类。 2)、在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。 3)、Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.

4.类加载的获取

public class HelloWorld {         public static void main(String[] args) {                 HelloWorld hello = new HelloWorld();                 Class c = hello.getClass();                 ClassLoader loader = c.getClassLoader();                 System.out.println(loader);                 System.out.println(loader.getParent());                 System.out.println(loader.getParent().getParent());         } }

打印结果:

sun.misc.Launcher$AppClassLoader@19821f sun.misc.Launcher$ExtClassLoader@addbf1 null

从上面的结果可以看出,并没有获取到ExtClassLoader的父Loader,原因是Bootstrap Loader(启动类加载器)是用C语言实现的,找不到一个确定的返回父Loader的方式,于是就返回null。

原文Blog: http://blog.csdn.net/love_Javc_you/article/details/38081683

是我一生的快乐;失去你,是我一生的遗憾;没有你,无法感受心灵的震撼。

关于Java类加载

相关文章:

你感兴趣的文章:

标签云: