Java Dynamic ClassLoading (I. intro)

1. JVM启动,会形成3个类加载器组成的初始化加载器层次结构:
bootstap classloader (加载核心类)
        ||
extension classloader(系统属性java.ext.dirs指向的目录,如果有多个目录,往往只使用其中的一个)
        ||
system classloader   (加载属性java.class.path指向的目录,即CLASSPATH)

2.  Class Load机制:
a)全盘负责:一个classloader加载一个class后,这个class所引用或者依赖的类也由这个classloader载入,除非显示的用另一个classloader载入
b)委托机制:先由父加载器加载,除非父加载器找不到时才从自己的类路径中去寻找
c)Cache机制:classloader采用缓存机制,即先查cache;若cache中保存了这个class就直接返回;若无,才从文件读取和转化为class并放入cache


3. ClassLoader加载类顺序(类ClassLoader中loadClass方法的过程,用户可以自己重新实现):
  1)检查cache是否有该类(ClassLoader.findLoadedClass):
    11)若有直接返回
    12)若无,请求父类加载
        121) 若无父,则从bootstap classloader加载
  1211)如果抛出ClassNotFoundException,则调用findClass(在类ClassLoader的实现中,findClass只是简单的抛出异常,用户自定义的ClassLoader可以重载这个方法,实现自己的载入策略)
   
  2)加载:
    21)寻找class文件(从与此classloader相关的类路径中寻找)
    22)从文件载入class
    23)找不到则抛出ClassNotFoundeException
  3)扩展:
    加载时即2),覆写findClass可以实现自己的载入策略
    加载时即2),覆写loadClass来实现自己的载入过程

 4. 如何实现运行时动态载入与更新
本质:只要动态改类搜索路径,从而清除classloader的cache已载入的class(每个ClassLoader一个)就可以了。
做法:
  1)继承ClassLoader:覆写loadClass方法,动态寻找class文件
  2)只要重新使用一个新的类搜索路径来new一个classloader就可以,这样既更新了类的搜索路径以便来载入新的class,也更新生成了一个空白的cache

classloader载入的方式
  1)Pre-loading 预先载入,载入基础类
  2)load-on-demand 按需求载入

JDK为啥有两个JRE?
  JDK中jre是运行java本身的程序,如javac
  ProgramFile(默认安装)中jre是运行用户编写的java程序

 

你可能感兴趣的:(java,jdk,ClassLoader,cache,Class,extension)