博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射机制剖析(二)— Class Loader
阅读量:4954 次
发布时间:2019-06-12

本文共 1965 字,大约阅读时间需要 6 分钟。

    上一篇博客简要的提了一下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相对难理解的地方一个是,对象将的层次关系和父载入器。还有一个是双亲载入机制。

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

转载于:https://www.cnblogs.com/gccbuaa/p/6937790.html

你可能感兴趣的文章
Excel导入遇到的问题An object with the same key already exists in the ObjectStateManager……
查看>>
《全栈性能Jmeter》-5JMeter负载与监听
查看>>
csharp: Export DataSet into Excel and import all the Excel sheets to DataSet
查看>>
C++调用android非静态函数
查看>>
C输出格式——转载
查看>>
转载:JS触发服务器控件的单击事件
查看>>
Hibernate的基本工作原理
查看>>
Download/Attach source-code/java-docs with maven dependencies
查看>>
博客迁移
查看>>
SpringCloud之服务注册与发现Eureka(一)
查看>>
tomcat源码 Container
查看>>
【最小生成树】BZOJ 1196: [HNOI2006]公路修建问题
查看>>
Android四大组件之Activity(一)
查看>>
lvs 初始 第一章
查看>>
META-LEARNING UPDATE RULES FOR UNSUPERVISED REPRESENTATION LEARNING
查看>>
cookie和setting
查看>>
漂在等待离职的日子(二)
查看>>
SharePoint BDC(Business Data Connectivity)服务-PowerShell
查看>>
在Lumia 950 XL上运行Windows 10 ARM64,是种什么体验?
查看>>
源 ppa
查看>>