JVM学习之类加载器子系统(介绍classLoader的使用、双亲委派等)

132 阅读2分钟

一、ClassLoader的常见方法及获取方式

  • 除引导类加载器外的类加载器都继承自ClassLoader
  • classloader的常用方法
方法名称描述
getParent()返回该类加载器的超类加载器
loadClass(String name)加载名称为name的类,并返回java.lang.class实例
findClass(String name)加载名称为name的类,并返回java.lang.class实例
  • 获取ClassLoader的途径
    • Class.forName("XXX").getClassLoader():获得XXX类的类加载器
    • Thread.currentThread().getContextClassLoader():获得当前线程上下文的加载器
    • ClassLoader.getSystemLoader():获得系统的加载器

二、双亲委派机制

  • 虚拟机采用按需加载的方式加载class,加载class采用双亲委派机制
  • 解释下双亲委派:
    • 如果一个类加载器收到类加载的请求,并不会自己先去加载,而是把这个请求委托给父类加载器去执行
    • 如果父类加载器还存在父类加载器,则继续向上委派。知道引导类加载器
    • 如果父类加载器能够加载类,则返回;如果不能,则向下委托给子类加载器,直到类能够被加载
  • 可以尝试自己创建一个java.lang.String类去验证这个问题
  • 优点:
    • 避免类的重复加载
    • 保证程序的安全,防止核心的程序被篡改

三、沙箱安全机制

  • 保护核心的api不受侵害的机制就是沙箱安全机制
  • 举个例子:自己创建一个java.lang.XXX类的时候,其实是不能正常使用这个类的

四、类的主动使用和被动使用

  • 类的主动使用:
    • 创建类的对象实例
    • 访问使用类或者接口的静态变量
    • 调用类的静态方法
    • 通过反射去创建类对象
    • 初始化一个类的子类
    • 类被标记为虚拟机启动时必须的类
  • 除了上面的几种主动使用类的情况,其余都是被动使用类
  • 主动、被动的区别:
    • 被动使用类不会进行类的初始化