zoukankan      html  css  js  c++  java
  • java反射机制剖析(二)— Class Loader

        上一篇博客简要的提了一下java反射机制中涉及到的一些相关知识,那么ClassLoader就是当中之中的一个。本篇博客就具体的对ClassLoader做一个相对深入的了解。

    作为了解须要知道的是。事实上类类型(Class Class)是和ClassLoader分不开的。由于ClassLoader须要的信息是由它提供的。类类型将在下一篇博客介绍。

    简单介绍

        ClassLoader是负责载入类的对象。作用是依据Jvm请求提供的类信息。将请求的类载入的内存中或者说载入到Jvm中。

    另外,每个类的Class对象(注意Class是类类型)都持有一个相应的ClassLoader的引用。

    能够通过Class对象的getClassLoader()方法得到。类和它的ClassLoader是相应的。所以类仅仅能通过它相应的ClassLoader载入。
        注意数组类的 Class 对象不是由类载入器创建的。而是由 Java 执行时依据须要自己主动创建。数组类的类载入器由 Class.getClassLoader() 返回,该载入器与其元素类型的类载入器是同样的;假设该元素类型是基本类型,则该数组类没有类载入器。

    分类

        JVM在执行时会产生三个ClassLoader。Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。
        Bootstrap ClassLoader:是用C++编写的,是JVM的内置载入器,它的名字是null。它用来载入核心类库,即在lib下的类库。做个实验。首先,String类肯定是java的核心类。那我们就以它为例来看看:    
    public static void main(String[] args){
    		String a="x";
    		System.out.println(a.getClass().getClassLoader());
    	}
               我们通过代码来获得String载入相应的ClassLoader的名字输出的结果为NULL。
        Extension ClassLoader:载入lib/ext下的类库。
        App ClassLoader:载入Classpath里的类库。

    层次关系

        之前我们说过,每个Class对象都会持有一个相应的ClassLoader的引用。每个ClassLoader对象也会持有一个Parent ClassLoader的引用。这里须要特别注意的是:这里所指的的Parent ClassLoader不是我们熟悉的继承关系,不是父类。!

    首先。我们要知道这里说的是ClassLoader对象,也就是说这的Parent ClassLoader事实上是一个对象的引用。以下看一张图。了解一下ClassLoader对象之间的层次关系:

              


          我们这里能够在做一个实验,来体会一下这个层次关系。代码例如以下:
             
    public static void main(String[] args){		
    		ClassLoader c =TestClassLoader.class.getClassLoader();
    		do {
    			System.out.println(c.getClass().getName());
    			c=c.getParent();
    		}while(c!=null);		
    	}
    }
    输出的结果为:
    sun.misc.Launcher$AppClassLoader
    sun.misc.Launcher$ExtClassLoader

    双亲载入机制

        层次关系中我们了解到了非常重要的一点:载入器对象之间的引用关系。被引用的对象称之为引用对象的父载入器。可以通过getParent()方法得到。

    那么双亲载入机制就是基于这样的引用的层次关系。即:当一个ClassLoader接到请求时,它不是直接载入相应的类。而是询问它引用的ClassLoader是否可以载入。而这个父ClassLoader则会询问自己的引用的ClassLoader是否载入了该类。

    仅仅有当全部的父ClassLoader都没有载入该类时,这个最初的ClassLoader才自己去载入申请的类。


        非常绕啊,文字说不清楚还是上图吧。


        双亲载入机制能够一定程度上保证安全性,由于仅仅要顶层ClassLoader能载入的东西就一定不会让下层的ClassLoader有机会载入。

    也就保证了有些自己定义的带有破坏性的类不会被载入到Jvm核心中。
        结语:ClassLoader相对难理解的地方一个是,对象将的层次关系和父载入器。还有一个是双亲载入机制。

    这里提供一个视频供大家參考。  

  • 相关阅读:
    在Centos7下源代码安装配置Nginx
    mysql5.7.21源码安装
    数据库设计三大范式
    电商项目中使用Redis实现秒杀功能
    PHP和Redis实现在高并发下的抢购及秒杀功能示例详解
    PHP面向对象(抽象类与抽象方法、接口的实现)
    php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
    利用VHD虚拟文件加密自己的个人信息
    Chrome常用快捷键
    stl本子
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6937790.html
Copyright © 2011-2022 走看看