天天看点

Java类加载器加载类顺序

java classloader的学习

java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class形式,然后由java虚拟机(jvm)解释执行,.class字节码文件本身是平台无关的,但是jvm却不是,为了实现所谓的一次编译,到处执行,sun提供了各个平台的jvm实现--也就是说jvm不是跨平台的,编译好的字节码文件被放在不同的操作系统平台上的jvm所解释执行,这个章节主要解释一下jvm装载类的机制

1.classloader是个毛东东?

    一个类如果要被jvm所调度执行,必须先把这个类加载到jvm内存里,java.lang下有个很重要的类classloader,这个类主要就是用来把指定名称(指定路径下)的类加载到jvm中

2.classloader的分类

   主要分4类,见下图橙色部分

   jvm类加载器:这个模式会加载java_home/lib下的jar包

   扩展类加载器:会加载java_home/lib/ext下的jar包

   系统类加载器:这个会去加载指定了classpath参数指定的jar文件

   用户自定义类加载器:sun提供的classloader是可以被继承的,允许用户自己实现类加载器

   类加载器的加载顺序如图所示:

Java类加载器加载类顺序

3.类加载顺序

  jvm并不是把所有的类一次性全部加载到jvm中的,也不是每次用到一个类的时候都去查找,对于jvm级别的类加载器在启动时就会把默认的java_home/lib里的class文件加载到jvm中,因为这些是系统常用的类,对于其他的第三方类,则采用用到时就去找,找到了就缓存起来的,下次再用到这个类的时候就可以直接用缓存起来的类对象了,classloader之间也是有父子关系的,没个classloader都有一个父classloader,在加载类时classloader与其父classloader的查找顺序如下图所示

Java类加载器加载类顺序