1.java在jvm中运行时支持两种类型的类加载器
引导类加载器:用于加载Java核心库(JAVA_HOME/jre/lib/rt.jar,resources.jar或sun.boot.class.path路径下的内容,用于提供JVM自身需要的类,jvm自身所用,由c语言实现,嵌套在jvm内部,没有继承ClassLoder。
自定义类加载器:用户定义的类,或继承ClassLoder的类,都会被jvm划分为自定义类加载器。
2.jdk中自带的三个类加载器
1、启动类加载器:rt.jar
2、扩展类加载器: ext\*.jar
3、应用类加载器: classpath
启动类加载器(属于引导类,没有继承ClassLoder)
- 出于安全考虑,BootStrap启动类加载器只加载包名为java,javax,sun等开头的类
扩展类加载器、应用类加载器(同属于自定义类,因为继承了ClassLoder)
3.加载过程
在写完一段代码后,程序启动时,会将所有需要的类全部加载到jvm中。通过类加载器加载,加载过程如下↓
2.1 首先是通过 "启动类加载器加载"
加载jre下的lib中的jar。
2.2 如果启动类加载不到,那么通过 "扩展类加载器加载"
加载jre中lib下的ext下的jar。
2.3 如果扩展类还加载不到,那么通过 "应用类加载器加载"
加载环境变量配置的classpath下的类
可能有的人不懂这个classpath,其实就是为了把java源文件编译之后的所有字节码文件放在一个特定的地方。
区别:
不配置classpath的情况下,你想要运行一个.java文件只能切到所属路径下 java 文件名.jar 才能运行。
配置classpath以后,在哪里都可以打开cmd 输入 java 文件名.java 运行。
配置方法如下↓
新建CLASSPATH 变量,变量值为:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意前面是有一个点的)
4. 双亲委派
优先从启动类加载器中加载,这个称为"父",
“父"无法加载到,再从扩展类中加载, 这个称为"母”。这就是双亲委派。
如果都加载不到才会考虑从应用类加载器中加载。直到加载到为止。