ClassLoader基础
ClassLoader介绍
ClassLoader翻译过来就是类加载器,普通java开发者用到不多,但是对于框架开发者来说比较常见。理解了ClassLoader的加载机制,有利于编写出更高效的代码。
作用
ClassLoader的具体作用就是将class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载
本文章就是为了学习一下ClassLoader这种加载机制
class文件的认识
我们都知道在Java中程序运行在虚拟机中,我们平时用文本编辑器或者IDE编写的程序都是.java,这是最基础的源码,但这类文件是不能直接运行的。如我们编写一个简单的程序HelloWorld.java
1 | |

然后我们需要在命令行中进行Java文件的编译

可以看到目录下生成了.class文件
再从命令行中执行命令

class文件是字节码格式文件,java虚拟机并不能直接识别我们平时编写的.java源文件,所以需要javac这个命令转换成.class文件
另外如果用C或者PYTHON编写的程序正确转换成.class文件后,java虚拟机也是可以识别执行的
Java环境变量
主要讲在windows编程下,主要的三个:JAVA_HOME、PATH、CLASSPATH
JAVA_HOME
指的是JDK安装的位置,一般默认安装在C盘
如
C:\Program Files\Java\jdk1.8.0_91
PATH
将程序路径包含在PATH当中后,在命令行窗口就可以直接输入它的名字了,而不再需要键入它的全路径,比如上面用到的javac和java两个命令
一般的
PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%PATH%;
也就是在原来的PATH路径上,添加JDK目录下的bin目录和jre目录的bin
CLASSPATH
CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
指向jar包路径
注意的是前面的.; . 代表当前目录
环境变量的设置与查看
设置右击我的电脑,点属性,点高级,点环境变量
查看的话可以打开命令行窗口
1 | |
JAVA类加载流程
Java语言系统自带有三个类加载器
Bootstrap ClassLoader
最顶层的加载类,主要加载核心类库。
由于是纯小白,这里记一些专业词
| 术语 | 大白话 |
|---|---|
| 类 / Class | 一段写好的代码(一个 .class 文件) |
| 加载 | 把硬盘上的代码文件读进内存,让它能被用 |
| ClassLoader | “类加载器”。一个负责去找代码、装进内存的程序 |
| Bootstrap | 英文”引导、最底层”。这里指辈分最高、优先级最高的那个加载器 |
| 核心类库 | Java 自带的最基础代码,比如 String(字符串)、System.out.println(打印)。没它们啥都干不了 |
| JRE | Java 运行环境。专门用来”跑”Java 程序的东西 |
| lib | library(库)的缩写。就是放代码文件的文件夹 |
| jar | 把一大堆 .class 文件打包成的一个文件,你可以理解成”Java 专用的 zip 压缩包” |
| rt.jar | rt = runtime(运行时)。装着几乎所有核心类的大压缩包 |
| JVM | Java 虚拟机。真正执行 Java 代码的引擎 |
| classpath | “类路径”。就是一张清单,写着”去哪几个地方找代码” |
-Xxxx |
启动 Java 时加给虚拟机的开关/参数 |
/a |
append,追加到末尾 |
/p |
prepend,插到最前面(优先级最高) |
管理员里有等级,Bootstrap 是级别最高的那个(它上面没有”上级”了)。它专门负责管最基础的那批代码(String、打印功能等,Java 自己的家底)。
这批核心代码被打包成rt.jar等文件,放在JRE 安装目录里的 lib 文件夹下面。Bootstrap 就去那儿找
另外需要注意的是可以通过启动jvm时,指定Xbootclasspath和路径来改变Bootstrap ClassLoader的加载目录。——启动程序的那一刻(敲 java 程序名 时),可以加一个开关,告诉 Bootstrap:”除了你原来找书的书架,再按我说的地址也去翻翻。”
比如java - Xbootclasspath/a:path被指定的文件追加到默认的bootstrap路径中。我们可以打开我的电脑,在上面的目录下查看,看看这些jar包是不是存在于这个目录
Extention ClassLoader
老二管理员,管“官方附加功能”
扩展:Java有一些官方提供的、可有可无的功能
扩展的类加载器,加载目录%JDK_HOME%\jre\lib\ext目录下的jar包和class文件。
“还可以加载 -Djava.ext.dirs选项指定的目录”
| 术语 | 人话 |
|---|---|
-D开头的参数 |
“设置一个系统属性”的开关,写法是 -D名字=值 |
| 系统属性 | 就是一堆”给整个程序看的配置小纸条”,程序随时能读 |
java.ext.dirs |
一张纸条的名字,内容 = “扩展目录在哪” |
-Djava.ext.dirs=某目录 |
改这张纸条:”扩展目录别用默认的了,用我指定的这个” |
如果这个目录能被指定,就能让老二加载我放的 jar——等于往程序里塞自己的代码。这就是它危险、后来被禁的原因
Appclass Loader也称为 SystemAppClass
加载当前应用的classpath的所有类,负责找跟程序直接相关的代码