data: 202101272105 source: Java Class loader 类加载器详细介绍

自定义类加载器

java.lang.ClassLoader 中有三个重要的方法:

  • loadClass()
  • findClass()
  • defineClass()

loadClass() 方法是加载目标类。

  • 首先查找当前 ClassLoader 以及它的双亲里面是否已经加载目标类
  • 如果自己和双亲都加载不了,调用 findClass() 让自定义加载器加载目标类
  • 子类需要实现 findClass() 方法实现不同的逻辑来获取目标类字节码
  • 拿到字节码后调用 defineClass() 方法将字节码转换成 Class 对象

自定义类加载器不要轻易覆盖 loadClass() 方法,否则可能导致自定义类加载器无法加载内置类库。

自定义类加载器的核心在于对字节码文件的获取,如果是加密的字节码则需要在自定义类加载器中对内容解密。

  • 传递的文件名需要是类的全限定名
  • 不要重写 loadClass 方法,容易破坏双亲委派模式