Java ClassLoader的一些事

来源:互联网 发布:lazada卖家数据分析 编辑:程序博客网 时间:2024/05/16 00:44

在Java中,存在着类加载的机制。

对于类加载器的使用,这里我说明几点:

1、类加载器的类型主要分为四类:

 【1】Bootstrp loader :

Bootstrp加载器是用C++语言写的,它是在Java虚拟机启动后初始化的,它主要负责加载%JAVA_HOME%/jre/lib,-Xbootclasspath

参数指定的路径以及%JAVA_HOME%/jre/classes中的类。

【2】ExtClassLoader  

Bootstrp loader加载ExtClassLoader,并且将ExtClassLoader的父加载器设置为Bootstrp loader.ExtClassLoader是用Java写的,

具体来说就是 sun.misc.Launcher$ExtClassLoader,ExtClassLoader主要加载%JAVA_HOME%/jre/lib/ext,此路径下的所有

classes目录以及java.ext.dirs系统变量指定的路径中类库。

【3】AppClassLoader 
Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并且将AppClassLoader的父加载器指定为 ExtClassLoader。

·AppClassLoader也是用Java写成的,它的实现类是 sun.misc.Launcher$AppClassLoader,另外我们知道ClassLoader中有个

getSystemClassLoader方法,此方法返回的正是AppclassLoader.AppClassLoader主要负责加载classpath所指定的位置的类或者

是jar文档,它也是Java程序默认的类加载器。

【4】用户自定义的类加载器


类加载的过程:ClassLoader.loadClass(String name, boolean resolve)

1、Class<?> c = findLoadedClass(name);

检查已经被加载的类,如果没有被加载过则会往下继续执行,如果被加载过,就直接返回已经加载过的类。

2、if (parent != null)

{
              c = parent.loadClass(name, false);
      } else {
                c = findBootstrapClassOrNull(name);
        }

判断该加载器的parent是否为空,

如果不为空,则调用父类的loadClass函数;

如果为空,则即为findBootstrapClassOrNull(name);判断是否已经被Bootstrp loader 加载。


3、如果以上均未加载成功,则findClass(name)



ps:不同加载器加载的同一个类是不相同的,不同类加载器加载的具有集成关系的类是可以转换的。


0 0
原创粉丝点击