第一节咱们说过一句话:全部的Java虚拟机实现必须在每一个类或接口被Java程序“ 首次主动使用”时才初始化他们java
但类加载器却不是这样:类加载器不须要等到某个类“被首次主动使用”时才加载类数组
两句话的区别就在于红线标注的地方,因此咱们要明确一点ClassLoader只负责类的加载,即 加载 》 链接 》初始化 的第一步安全
由上一节咱们知道,jvm有三种加载器,每种加载器负责特定目录的类。根类加载器(BootStrap)和扩展加载器(Extension)没必要说,它们负责加载的都是特定目录的类,并且这些类是固定的,咱们不能说咱们把本身编写的类加到java.lang目录下就能使这个类被根类加载器加载,那样就太不安全了。由于加载的类是固定的就很好理解,可是系统类加载器(System)就比较很差理解了,它是加载classpath定义的目录下的类。并且咱们知道classpath路径是能够自定义的,也就是说它能够加载任意目录的类,只要咱们在classpath下指定了该目录。jvm
好比咱们安装好jdk配置好环境变量以后,咱们就能够在任意位置使用javac命令和java命令,可是你有没有想过,咱们并无指定类加载的路径,为何咱们在任何地方都能加载到目标类文件呢。缘由很简单就是环境变量的配置,咱们通常回配置两个参数path和classpath。path的做用是让咱们在任意目录下都能找到javac和java命令,可是单单找到命令是不够的,有命令没有类文件同样白搭,因此classpath的设置就是帮咱们找到类文件,classpath通常这样设置 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 。注意最开始的那个点,最不起眼却最重要,它表明当前文件夹,当咱们在一个很偏僻的文件夹使用javac命令编译java文件,这个文件夹就是咱们工做的当前文件夹,jvm就会到path下去寻找javac命令,path配置正确找到命令。而后到classpath下去寻找class文件,而后就发现了 " . " ,因而就会到当前文件夹下寻找,一下就找到了,类编译就完成了,java命令同样。this
如今系统类加载器(System)已经很清楚了。那咱们能不能本身编写本身的类加载器呢,答案是确定的,固然,类加载很复杂,要咱们从零作起是不现实的,咱们只能根据已有的类加载器进行包装,定制本身的ClassLoaderspa
自定义类加载器分为如下几个步骤:code
一、定义类。继承ClassLoader继承
二、重写ClassLoader的 findClass方法接口
就是这么简单,下面是我本身写的自定义类加载器例子ci
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
而后调用
1 2 3 4 5 6 7 |
|
结果 : classLoader.MyClassLoader@60e53b93