• Java Class Loader解析


    jvm classLoader architecture:

    1. Bootstrap ClassLoader/启动类加载器 
      主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作。
    2. Extension ClassLoader/扩展类加载器 
      主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作。
    3. System ClassLoader/系统类加载器 
      主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作。
    4. User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类) 
      在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性。

    类加载器特性:

    1. 每个ClassLoader都维护了一份自己的名称空间, 同一个名称空间里不能出现两个同名的类。
    2. 为了实现java安全沙箱模型顶层的类加载器安全机制, java默认采用了 " 双亲委派的加载链 " 结构。

     

    为什么要使用这种双亲委托模式呢?

    1. 因为这样可以避免重复加载,当父亲已经加载了该类的时候,就没有必要子ClassLoader再加载一次。
    2. 考虑到安全因素,我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这 样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的 ClassLoader。

    java动态载入class的两种方式:

    1. implicit隐式,即利用实例化才载入的特性来动态载入class
    2. explicit显式方式,又分两种方式:
      1. java.lang.Class的forName()方法
      2. java.lang.ClassLoader的loadClass()方法
  • 相关阅读:
    django上传下载大文件
    ssh隧道技术
    防止网站被抓
    lvm在线扩容
    Python之配置文件模块 ConfigParser
    Oracle常用查询
    Oracle_where子句
    Oracle_单行函数
    Oracle_多行函数
    Oracle_SQL92_连接查询
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2987598.html
Copyright © 2020-2023  润新知