类加载机制

java类加载简单说就是把.class文件转化为java.lang.Class对象的过程,这个过程由类加载器完成。

java.lang.ClassLoader 中与加载类相关的方法:

  • getParent() 返回该类加载器的父类加载器。
  • loadClass(String name) 加载名称为 name的类,返回的结果是 java.lang.Class类的实例。
  • findClass(String name) 查找名称为 name的类,返回的结果是 java.lang.Class类的实例。
  • findLoadedClass(String name) 查找名称为 name的已经被加载过的类,返回的结果是 java.lang.Class类的实例。
  • defineClass(String name, byte[] b, int off, int len) 把字节数组 b中的内容转换成 Java 类,返回的结果是 java.lang.Class类的实例。这个方法被声明为 final的。
  • resolveClass(Class<?> c) 链接指定的 Java 类。

loadClass和defineClass都可以动态加载class。

java类加载器的树状结构:

  • bootstrap class loader 加载java核心库rt.jar,由C实现
  • sun.misc.Launcher$ExtClassLoader 扩展类加载器,用于加载java扩展库
  • sun.misc.Launcher$AppClassLoader 系统类加载器,根据CLASSPATH加载java应用中的类,ClassLoader.getSystemClassLoader()。

9VJZz6.jpg

类加载机制特性:

  • 类加载器会缓存已加载的Class实例,多次调用loadClass(name),只会返回同一个实例
  • 相同name、相同ClassLoader的Class实例才是相同的Class
    • 保护了Java库的类型安全
    • 框架可以实现自己的类加载器来防止类名冲突(破坏双亲委托机制,部分委托java/sun等前缀)
  • 代理加载 调用父类的加载器进行加载
    • defineClass 定义加载器(defining loader)即 Class.getClassLoader();
    • loadClass 初始加载器(initiating loader)