Java 运行时类型信息,简称RTTI;RTTI能够让我们在
RTTI可以分为两种:
- 。这是在所有的类型就可用。
- 。它能够帮助我们发现类型信息。
很显然,输出结果:
现在分析
首先,
上面说的RTTI强制类型转换只是一部分,因为我们上面只讨论到。
接下来的代码才是多态在起作用。。
2.1. 类加载器概述
要理解Java中的RTTI,我们必须要而我们这里要介绍的所以
在任何Java程序中,
为了让程序在内存中生成类的Class对象,我们有必要了解一下
有关Class文件的结构,可以查看另一篇文章:Java虚拟机实践(1)——逐个字节分析.class文件字节码二进制内容,这里不详细介绍,只要知道,我们的
类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个声明周期分为
之前说过,
程序运行时,字节码指令为时,如果类没有进行过初始化,则需要先触发其初始化。体现到源代码中就是:。值得注意的是,
使用java.lang.reflect包如果类没有进行过初始化,则需先触发其初始化。
当,则需要先触发其父类的初始化。
虚拟机启动时会被虚拟机先进行初始化。
实例解析的结果为的方法句柄时,并且此方法句柄对应的类没有进行过初始化,则需要先触发其初始化。
这五种情况我们称之为对类的一个。
Java程序在运行时,所以,我们能够知道:
那么类加载阶段,到底做了什么呢?
- 通过类的获取到此类的二进制字节流。
- 将字节流所代表的
- 在
2.2. Class对象
现在我们已经知道,类加载阶段会在内存中生成该类的Class对象。现在我们来简单探究一下Class对象。
在了解Class对象之前,我们有必要知道,我们可以使用下面的方法来手动硬编码加载类:
上面的代码应该在学Java JDBC时很常见的代码,我们通常称之为,那么现在我们学了之前的知识,我们知道,这是。
再看看下面的代码:
输出如下:
可以看到,。
而,而我们知道
那看看官方文档怎么说的吧,下面是Java的
意思是说:
那么我们再看看
而我们知道:
现在能够通过硬编码的方式来手动加载类,并且获取类的Class对象。实际上,
- 其中obj为已经实例化的一个类的对象,通过调用其getClass方法,能够获取此类的Class对象。
既然能够获取到类的Class对象,那么我们说过,
代码很简单,输出:
Class对象的方法:
相比方式,Class字面量更加
下面表格左右是等效的
注意,
下面是一个例子:
输出如下:
这里我们将static变量分为,对于非final的static变量,我们访问时就算一次主动引用。而对于
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/13709.html