Java中深入浅析的类加载器与名称空间

  介绍

深入浅析Java中的类加载器与名称空间?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

<强> Java类加载器和名称空间详细介绍

,Java虚拟机通过装载,连接和初始化一个Java类型,使该类型可以被正在运行的Java程序所使用,其中,装载就是把二进制形式的Java类型读入Java虚拟机中。连接就是把这种已经读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去。连接阶段分为三个步骤:验证,准备和解析。验证确保了Java类型数据格式正确并适于Java虚拟机使用。准备负责为该类分配它所需的内存,比如为它的类变量分配内存。解析把常量池中的符号引用转换为直接引用,如内存地址指针。在初始化期间,激活类的静态变量的初始化代码和静态代码块。

,装载步骤的最终产品是一个被装载类型的类类的实例对象,它成为JAVA程序与内部数据结构之间的接口。对于每一个被装载的类型,虚拟机都会相应地为它创建一个类类的实例。

<强> 1类装载器的安全作用

,JAVA类装载器在JAVA安全体系结构中起着最关重要的作用,是JAVA安全沙箱的第一道防线。类装载器体系结构在三个方面对JAVA的沙箱起作用:

1)它防止恶意代码去干涉善意的代码
2)它守护了被信任的类库的边界
3)它将代码归入某类(称为保护域),该类确定了代码可以进行哪些操作。

类装载器体系结构可以防止恶意代码去干涉善意的代码,这是通过为不同的类装载器装入的类提供不同的命名空间来实现的。

<强> 2双亲委派模型

,JAVA虚拟机规范定义了两种类型的类装载器——启动类装载器和用户自定义类装载器,启动类装载器是JAVA虚拟机实现的一部分,通过继承类加载器类,用户可以创建自定义的类装载器来完成特定要求的加载. JAVA虚拟机已经创建了2个自定义类装载器——扩展类装载器和系统类装载器。
每一个用户自定义的类装载器在创建时被分配一个“双”亲父类装载器。如果没有显示地传递一个双亲类装载器给用户自定义的类装载器的构造方法,系统类装载器就默认被指定为双亲。如果传递到构造方法的是一个已有的用户自定义类装载器的引用,该用户自定义类装载器就作为双亲,如果向构造方法传递了空,启动类装载器就是双亲。
启动类装载器引导类加载器:它是JAVA虚拟机实现的一部分,是c/c++实现的,它没有双亲。启动类装载器装载JAVA核心库代码。

扩展类装载器扩展类加载器:继承自URLClassLoader,初始化向构造方法传递了空,所以双亲是引导Classloaser。它从java.ext。dirs扩展目录中装载代码。

系统类装载器应用程序类加载器:继承自URLClassLoader,双亲是扩展Classloaser。它从类路径路径中装载应用程序代码。

其中,网络类装载器URLClassLoader是JAVA库提供的一个类装载器,用来从网络其他位置装载类。

深入浅析JAVA中的类加载器与名称空间“> </p> <p>双亲孩子类装载器委派链</p> <p>,在双亲委派模型下,当一个装载器被请求装载某个类时,它首先委托自己的双亲父去装载,若家长能装载,则返回这个类所对应的类对象,若父母不能装载,则由母公司的请求者去装载。<br/> </p> <p>现在假设要求辛迪去装载一个名为java.io.FileReader的类型.Cindy第一件事情就是去找妈妈来装载那个类型;妈妈所做的第一件事情就是去找奶奶来装载那个类型,而奶奶首先去找启动类装载器去装载。在这个例子中,启动类装载器可以装载那个类型,它就返回代表io。FileReader的类实例给Grandma.Grandma传递该阶级的引用妈妈,妈妈再回传给辛迪,辛迪返回给程序。</p> <p>, <img src=Java中深入浅析的类加载器与名称空间