JVM classLoader

来源:互联网 发布:gps定位修改软件 编辑:程序博客网 时间:2024/05/17 18:00

 

1)三个类加载器:

bootstrap classloader 引导(也称为原始)类加载器,它负责加载Java的核心类。

extension classloader 扩展类加载器,它负责加载JRE的扩展目录中JAR的类包。

system classloader 系统(也称为应用)类加载器,加载应用程序的类。

bootstrap classloader不是一个真正的ClassLoader实例

 

   JVM在运行时会产生三个ClassLoader:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader

AppClassLoader的Parent是ExtClassLoader,而ExtClassLoader的Parent为Bootstrap ClassLoader

 

2)获取引导类加载器加载了哪些类:

 

在jre1.5中,该段输出: 

file:/D:/Program%20Files/Java/jdk1.6.0_14/jre/lib/resources.jar
       file:/D:/Program%20Files/Java/jdk1.6.0_14/jre/lib/rt.jar
       file:/D:/Program%20Files/Java/jdk1.6.0_14/jre/lib/sunrsasign.jar
       file:/D:/Program%20Files/Java/jdk1.6.0_14/jre/lib/jsse.jar
       file:/D:/Program%20Files/Java/jdk1.6.0_14/jre/lib/jce.jar
       file:/D:/Program%20Files/Java/jdk1.6.0_14/jre/lib/charsets.jar
       file:/D:/Program%20Files/Java/jdk1.6.0_14/jre/classes

即为所加载的java的核心类


 

3)获取应用类加载器:

ClassLoader.getSystemClassLoader()

 


4JVM类加载机制:全盘负责委托机制

      全盘负责:当一个classloader加载一个Class的时候,这个Class所依赖的和引用的所有Class也由这个classloader负责载入,除非是显式的使用另外一个classloader载入;

     委托机制:先让parent(父)类加载器(而不是super,它与parent classloader类不是继承关系)寻找,只有在parent找不到的时候才从自己的类路径中去寻找。

Cache机制:如果cache中保存了这个Class就直接返回它,如果没有才从文件中读取和转换成Class,并存入cache,这就是为什么我们修改了Class但是必须重新启动JVM才能生效的原因。

 

5每个ClassLoader加载Class的过程是:

1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2
2.
如果parent
classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4
3.
请求parent
classloader载入,如果成功到8,不成功到5
4.
请求jvmbootstrap
classloader中载入,如果成功到8
5.
寻找Class文件(从与此
classloader相关的类路径中寻找)。如果找不到则到7.
6.
从文件中载入Class,到
8.
7.
抛出
ClassNotFoundException.
8.
返回
Class.
其中5.6步我们可以通过覆盖
ClassLoaderfindClass方法来实现自己的载入策略。甚至覆盖loadClass方法来实现自己的载入过程。

 

 

 

 

原创粉丝点击