类加载器的详解以及脑图

265 阅读3分钟

前言

面试官:讲一下类加载器?
秋蝉、:......嗯...,想了10秒钟,类加载器就是加载字节码文件的。
面试官:没了?
秋蝉、:没了,我就了解这么多。其他的想不起来了。
面试官:今天的面试到这结束,还有什么要问的吗?....回去等通知吧。

正文

以上是我亲身经历的一个场景,当时问的不是类加载器。回去等通知吧,不要傻乎乎的真在那等,一般让你回去等通知的基本就是不合适。没整理这个类加载器之前,直接让我说类加载器我也很难讲出一堆东西,也会几句话结束。整理了这个脑图以后学习了很多,也方便了自己以后随时查看。

定义

Java类加载器(英语:Java Classloader)是Java运行时环境(Java Runtime Environment)的一个部件,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。

特性

唯一性

1、类与类加载器确定这个类在JVM中的唯一性。
2、不同的类加载器,就算是同一个字节码文件,在VM中的类实例也不相同。

隔离性

1、每一个类加载器都有一个独立的命名空间。
2、同一个命名空间的类是可见的。

分类

内置类加载器

Bootstrap ClassLoader

1、引导类加载器【根类加载器、启动类加载器】.
2、获取加载的类库全路径:System.getProperty("sun.boot.class.path")【来源与源码Launcher类】.
3、C++语言实现,主要负责加载jre/lib路径下的核心类库。也加载jre\classes。
4、属于虚拟机实现的一部分,没有继承java.lang.ClassLoader类。

ExtClassLoader

1、扩展类加载器
2、获取加载的类库全路径:System.out.println(System.getProperty("java.ext.dirs"));【来源与源码Launcher类】
3、Java语言实现,继承自URLClassLoader类,负责加载JDK安装目录下\jre\lib\ext目录下的类库。如果把用户创建的JAR文件放到这个目录下,也会自动由扩展类加载器加载。
4、可以在Launcher下查看其源码。
5、是java.lang.ClassLoader类的子类。

AppClassLoader

1、系统类加载器。
2、获取加载的类库全路径:System.out.println(System.getProperty("java.class.path"));【来源与源码Launcher类】。
3、Java语言实现,继承自URLClassLoader类,负责加载环境变量class path或者系统属性java.class.path所指定的目录中的类。
4、可以在Launcher下查看其源码。
5、它是用户自定义的类加载器的默认父类加载器。也是java.lang.ClassLoader的子类。

自定义类加载器注意事项

继承ClassLoader,覆盖核心方法findClass,定义私有方法loadClass将其转化成二进制数据流,从而加载到Class类。

自定义要加载的字节码文件来源,如网络、数据库等。 可以将这些字节码文件加载到自定义的类加载器实现加载、解密、验证等操作。

默认的ClassLoader加载是可以反编译的,如果不想被反编译可以把字节码文件加密,防止被反编译,在用自定义的类加载器解密字节码文件加载到JVM中

自定义类加载器

package,如果加载的类有package文件,则查找时,class的名字应该为包名.类名,不然会报NOClassDefFoundError。 如果两类不是同一个加载器加载,强制转换,会报NOClassDefFoundError错误。 不是同一加载器加载的两类如果想访问对方,则需要使用反射机制。

继承关系

Bootstrap ClassLoader
1、C++语言写的。
ExtClassLoader
1、继承自 URLClassLoader
2、URLClassLoader继承自ClassLoader
AppClassLoader
1、继承自 URLClassLoader
2、URLClassLoader继承自ClassLoader
自定义类加载器
1、需要继承ClassLoader

委托机制

父类加载器,并不是继承关系 自定义类加载器 系统类加载器 AppClassLoader 扩展类加载器 ExtClassLoader 根类加载器 Bootstrap ClassLoader

图解委托机制
图解委托机制

脑图

类加载器脑图
类加载器脑图

大佬,看都看到这了,不关注一个再走🍻🍻 真心感谢关注的哥们