[b]类加载器[/b]
1. 引导类加载器
负责加载系统的内核文件,如 java.lang、java.util包等
搜录路径为: JAVA_HOME/jre/lib 及 JAVA_HOME/lib
2. 扩展类加载器
负责加载JDK的扩展包,搜寻路径为:JAVA_HOME/jre/lib/ext
3. 系统类加载器
负责加载用户的自定义类型;
4. 自定义类加载器
根据业务规则来加载
各种类加载器的关系:
引导类加载器
|
扩展类加载器
|
系统类加载器
|
自定义类加载器
相关API:
java.lang.Class
getClassLoader() --> ClassLoader
java.lang.ClassLoader
getParent() --> ClassLoader
loadClass(String name, boolean resolve)
findLoadClass(String name);
findClass(String);
defineClass(String name, byte[] buf, int off, int len);
[b]类加载的原理:[/b]
1.所有类的加载都会递归地调用父类的类加载器来加载类, 采用的是一种代理的方式
如下:
比如, JVM现在在加载 org.example.Student 这个类, 则首选会加载 Object类, 因为任何类都继承于 java.lang.Object
而Student的类加载器,在默认情况下为sun.misc.Lanucher$AppClassLoader, 依据代理方式 ,它会先去代理给父类的加载器【扩展,再到引导】
由父类加载器尝试去加载 Object, Student, 当然, 引导类加载器可以加载到 Object类,但加载不到 Student, 所以,最终, Student会被 应用类加载器所加载;
2. 类加载器 ClassLoader 加载类时,调用方法的顺序为:
首先根据完整的全限定名 去调用 loadClass 方法 【此方法实现了 代理的方式,会依次代理给父类加载器】
在loadClass方法内会调用 findLoadClass, 来查找此类之前是否已加载过, 如果有,则返回,如果没有,则调用
findClass 方法去查找, 【ClassLoader默认情况下会依据 classpath环境变量来查找】
最后调用 defineClass 把字节码转换成 java.lang.Class的一个实例;
1. 引导类加载器
负责加载系统的内核文件,如 java.lang、java.util包等
搜录路径为: JAVA_HOME/jre/lib 及 JAVA_HOME/lib
2. 扩展类加载器
负责加载JDK的扩展包,搜寻路径为:JAVA_HOME/jre/lib/ext
3. 系统类加载器
负责加载用户的自定义类型;
4. 自定义类加载器
根据业务规则来加载
各种类加载器的关系:
引导类加载器
|
扩展类加载器
|
系统类加载器
|
自定义类加载器
相关API:
java.lang.Class
getClassLoader() --> ClassLoader
java.lang.ClassLoader
getParent() --> ClassLoader
loadClass(String name, boolean resolve)
findLoadClass(String name);
findClass(String);
defineClass(String name, byte[] buf, int off, int len);
[b]类加载的原理:[/b]
1.所有类的加载都会递归地调用父类的类加载器来加载类, 采用的是一种代理的方式
如下:
比如, JVM现在在加载 org.example.Student 这个类, 则首选会加载 Object类, 因为任何类都继承于 java.lang.Object
而Student的类加载器,在默认情况下为sun.misc.Lanucher$AppClassLoader, 依据代理方式 ,它会先去代理给父类的加载器【扩展,再到引导】
由父类加载器尝试去加载 Object, Student, 当然, 引导类加载器可以加载到 Object类,但加载不到 Student, 所以,最终, Student会被 应用类加载器所加载;
2. 类加载器 ClassLoader 加载类时,调用方法的顺序为:
首先根据完整的全限定名 去调用 loadClass 方法 【此方法实现了 代理的方式,会依次代理给父类加载器】
在loadClass方法内会调用 findLoadClass, 来查找此类之前是否已加载过, 如果有,则返回,如果没有,则调用
findClass 方法去查找, 【ClassLoader默认情况下会依据 classpath环境变量来查找】
最后调用 defineClass 把字节码转换成 java.lang.Class的一个实例;