博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java RTTI笔记整理
阅读量:4040 次
发布时间:2019-05-24

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

RTTI: run time type information/Identification ,运行时类型信息或者运行时类型标识。

从它本身的定义上来说,它的使用范围是在程序运行时,有别于大多数的静态类型编译。

在运行时需要确定对象类型的情景主要有反射,父类对象与子类对象之间转型,接口和实现类之间的转型这三种情况。

什么时候RTTI开始工作呢?

   JVM加载class文件是当程序需要这个文件的时候才会进行加载,可以认为是懒加载的处理方式进行加载的。加载是通过Class这个东东进行加载的,这里面有大量处理RTTI的方法,例如:

Class.forName("MyClass");
加载进JVM的情况主要有以下几种:

第一:类的静态方法被调用,包括构造函数

      特别的当默认构造方法被自定义带参数的构造方法代替,却引用默认构造函数进行加载的时候,会加载失败

第二种:类的静态属性属性被引用

第三种:上面提到的用Class.forName()进行加载的时候

     如果提供的路径错误会产生类未找到异常。

第四种:反射的一些情况中会加载。

    如果没有在反射的时候创建对象,仅仅只是获取类的属性和方法的信息,JVM是不会进行加载的。

RTTI在java中是很好理解的,总体上来讲,只要是涉及到类型转换的都会使用RTTI来获取类型信息。

在使用泛型的时候,RTTI是它坚实的基础,因为泛型涉及到了大量的类型转换。

当使用类型转换的时候,需要进行判断当前对象是不是某种类型,可以使用instanceof或者cast在强制转型之前进行判断。

这两种转换判断具体使用可以查找一下资料。

曾经在工作中遇到一个非常古怪的关于这个地方的问题:

   在大型程序中,使用debug模式下进行调试启动,启动完成进行debug的时候,因为可能程序非常卡,报出了一个类未加载的异常。与之对应的是在正常启动非debug模式下,程序没有重现这个异常。最后的解决办法是在debug模式下加入Class.forName()进行加载没有加载的类。

转载地址:http://yepdi.baihongyu.com/

你可能感兴趣的文章
自然计算时间复杂度杂谈
查看>>
当前主要目标和工作
查看>>
Intellij IDEA启动优化,让开发的感觉飞起来
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
如何优雅的编程,lombok你怎么这么好用
查看>>
一文看清HBase的使用场景
查看>>
除了负载均衡,Nginx还可以做很多,限流、缓存、黑白名单
查看>>
解析zookeeper的工作流程
查看>>
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
以太网基础知识
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
linux内核学习(4)建立正式内核的页式内存映射, 以x86 32位模式为例
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>