转行小白成长路-java篇
第14章:类型信息(上)
此篇确实是讲类型的有关信息。感觉很重要。今天上半部分的重点放在了什么是RTTI,都有那几种方式,及根据内容引发的思考对以前的补充
RTTI是运行时类型检查的一种缩写,这个RTTI可是比自己想象的要重要的多,重文件初始化,到运行时加载文件和转型前都有用到,而且用的深度远超我之前的想象。
- 项目启动时期:文件加载,我们以前知道是按照ClassPath给定的路径中查找相应的文件读入程序中,现在在这部分要加入一些补充。类加载器由jvm实现,会在项目启动的时候加载进入相应的字节码文件,这里必须提一下,类加载器不是唯一的,可以我们主动更改,但是极少动他。类加载器加载的字节码文件并不是全部加载,而是由懒加载的方式(用到才取)读取一部分到内存中。他们读取文件的过程大致是先加载(由类加载器完成,不管不顾先看一遍),然后建立连接(建立引用关系,并初始化静态资源,由此说明静态资源存储位置肯定不同),最后初始化(利用构造器属于静态方法,于是乎这里有点问题,明天分析),至此类加载完成,这里类的字节码文件也都是被当作对象来存储相关信息,这里就有意思了。我们之前分析,所有对象都继承Object,这个字节码文件也利用对象的方式存储,但是没有相关的操作这些字节码文件的类(就像class管理对象,看不到谁管理了字节码文件)。说明他们都是直接继承Object,今天查看了object发现有所体会,object中肯定会有一些成员变量被隐藏了,只展示了一些可见的get方法和线程操作。联想我们之前总结继承和多态,这里有个大胆猜想,object类其实是一个大型的封装类,只不过有些东西让我不可见,比如类型,地址,这些都让jvm自动进行了
- 项目运行时:有三种方式加载类Class.for Name()/XX.Class/InstanceOf()这三种,这三种其实都是依赖内置的Class类,这个内置的Class类更像是Object的一个工具类继承了object但是扩展了。这部分也是猜测。前两种获取类对象的引用,不同点是第一种直接就初始化了字节码文件的类,走了一遍上面说的。第二种就是像正常类的工作方式,用到才加载。这部分如果有底层的源码就太棒了
- 容器的相关猜想,书中说到容器其实都是上转型为object后,在使用的时候在下转型,转到原来的对象类型上。类型间的转化,这说明引用也是object形式,并不是像之前想的那样单纯。