[java乱弹]---(4)我眼中的“Class”

版权声明: https://blog.csdn.net/zhaoyaxuan001/article/details/82313788
声明:
Author:赵志乾
Date:2018-9-2
Declaration:All Right Reserved!!!

在《我眼中的工具类》一节,我们谈及到动态绑定。说动态绑定机制依赖于虚拟机构建对象时将打包后的类型信息自动关联到堆空间为对象分配到的内存上。那我们今天就来看一下这里面所涉及到的类型信息都有啥?以及类型信息是如何关联上去的。

类型信息的关联是在运行过程中,虚拟机构建对象时才完成的。大致过程为:虚拟机在构建对象时,会依据创建对象所使用的原材料“类”获取类型打包后的引用,然后在布局为对象构建所分配出的堆内存时,规划出一个类型标识占位符。最后将这个占位符替换为类型打包后的引用,从而完成堆内存空间存放对象同其实际类型的关联。

既然关联是通过引用来完成的,那引用的那一坨东西到底以什么形态存在的呢?其实虚拟机有一个专门用于存放类型的通用结构,称作Class类。虽然在java中,Class类是个特殊的存在,但作为类的一种,依然是为虚拟机构建对象提供原材料。只不过这种原材料并不完善,他只是一个容器,里面能够存放软件开发人员提供给虚拟机用于构建其他对象的原材料,也就是说:“虚拟机在加载字节码过程中,将构建对象用的原材料(除Class类对象构建所需原材料外)存放于Class类的实例中,然后从这个实例中取出原材料构建其他对象。或者可以认为Class类实例是构建用户对象所用原材料的中转站”。

Class类实例除了能够辅助动态绑定机制的实现外,还能用于辅助实现Java中的反射机制。因为Class实例存放了构建对象所需要的各种原材料,如果能够有一消息可以告诉虚拟机:“你现在可以用某个Class类实例中的资源去构建对象”,便可以在软件开发人员不感知这些资源的情况下实现类的实例化。而事实上,也确实有这样的一套实现机制:如调用Class类实例的newInstance方法。

当我们通过向虚拟机发送消息的方式实现未知类间接实例化后,便出现了新的问题。这个实例是穿着Object这件变身外袍出现的,我们该如何识别袍子里面到底是个什么鬼的?这依然要依赖于Class类实例。

“类”是虚拟机构建对象的原材料》一节中也提到过,一个对象是可以有多件变身外袍的,而他具体穿的是哪件,是由我们给换上的。可通过间接方式实例化出的对象,我们只知道有Object这样一件外袍,该如何是好呢?从上文可知,Class类实例是关联在对象上的,而对象拥有的外袍也都被打包放在了Class类实例中,所以如果能够通过某种手段取得Class类实例中的信息,一切问题便迎刃而解。而Class类实例也恰恰提供了一系列的方法来搞定这些事:如获取方法、数据域、接口等等!

综上所述:Class类为虚拟机在堆内存中构建其他对象所需原材料的存放容器提供原材料。并且Class类实例能够存放构建一个对象所需的各种原材料,让我们拥有一种新的途径来告知虚拟机在何时构建某个对象。由于Class类实例会被关联到实例化的对象上,从而可以通过Class类实例获取更多的运行时信息,为代码设计提供更多的便利。

猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/82313788
今日推荐