.java文件经过编译成为了.class字节码文件,字节码文件需要类加载器加载到内存之后才能创建对象,执行代码。

简介

Java类加载器(Java Classloader)是Java运行时环境(Java Runtime Environment)的一部分,负责动态加载Java类到Java虚拟机的内存空间中。

分类:

java默认有三种类加载器,BootstrapClassLoader、ExtensionClassLoader、App ClassLoader。

BootstrapClassLoader(引导启动类加载器):


启动类加载器是嵌在JVM内核中的加载器,该加载器是用C++语言写的。它负责将JAVA_HOME/lib下面的核心类库或-Xbootclasspath选项指定的jar包等虚拟机识别的类库加载到内存中。由于启动类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用(引导启动类加载器无法被应用程序直接使用)。具体可由启动类加载器加载到的路径可通过System.getProperty(“sun.boot.class.path”)查看。

ExtensionClassLoader(扩展类加载器):

ExtensionClassLoader是用JAVA编写,它的父加载器是BootstrapClassLoader。

扩展类加载器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的,它负责将JAVA_HOME /lib/ext或者由系统变量-Djava.ext.dir指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类加载器,具体可由扩展类加载器加载到的路径可通过System.getProperty("java.ext.dirs")查看

App ClassLoader(应用类加载器):

App ClassLoader是应用程序类加载器,负责加载应用程序classpath目录下的所有jar和class文件。它的父加载器为Extension ClassLoader

系统类加载器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的,它负责将用户类路径(java -classpath或-Djava.class.path变量所指的目录,即当前类所在路径及其引用的第三方类库的路径)下的类库加载到内存中。开发者可以直接使用系统类加载器,具体可由系统类加载器加载到的路径可通过System.getProperty("java.class.path")查看。

层级关系:

JAVA加载对象的作用域 java的加载器有几种_类加载器

类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。JVM在加载类时默认采用的是双亲委派机制。

双亲委派模型:

通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归 (本质上就是loadClass函数的递归调用),因此所有的加载请求最终都应该传送到顶层的启动类加载器中。如果一个类加载器收到了一个类加载请求,它不会自己去尝试加载这个类,而是把这个请求转交给父类加载器去完成。每一个层次的类加载器都是如此。因此所有的类加载请求都应该传递到最顶层的启动类加载器中,只有到父类加载器反馈自己无法完成这个加载请求(在它的搜索范围没有找到这个类)时,子类加载器才会尝试自己去加载。(如果父类加载器可以完成这个类加载请求,就成功返回;只有当父类加载器无法完成此加载请求时,子加载器才会尝试自己去加载)委派的好处就是避免有些类被重复加载。