Java RTTI和反射的区别?
一、Java RTTI和反射的区别
区别
对于RTTI来说,编译器在编译时打开和检查.class文件。而对于反射机制来说,.class文件在编译时是不获取的,所以是在运行时打开和检查.class文件。
当通过反射和一个未知的对象打交道时,JVM只是简单的检查这个对象,看他属于哪一个特定的类(就像RTTI),因此无论是使用RTTI还是反射机制,那个类的.class文件对与java虚拟机来说必须是可以获取的,要么是在本地磁盘空间或者是从网络资源上。
怎样理解RTTI
RTTI(Run-Time Type Infomation)又叫运行时类型信息。怎样才叫运行时类型信息呢?看文字我们可能很懵逼,但是在Java中你肯定知道多态(动态绑定,又叫运行时绑定),假如我们有一个基类A中有一个方法a(),子类B,C都继承了类A,并且重写了a()方法,各自输出自己的类型信息,但是我们并不想通过子类来实例化自己调用自己的方法,而是将创建子类的行为交给一个工厂(就好比现在有个printfInfo(A temp),参数为基类A定义的,方法里就是根据具体传进来的对象来调用那个对象的a()方法)。对于传入的实例化对象无论时B还是C,都会在调用printfInfo方法的时候向上转型(子类转化为基类)为A类型。这是RTTI最基本的使用形式,在Java中,所有的了类型转换都是在运行时进行正确性检查的。这也就是RTTI的含义:在运行时,识别一个对象的类型。
延伸阅读:
二、Class对象
Java中的每一个类都是一个Class对象,实际上我们定义类的时候不就是用Class关键字来定义的吗?我们知道Java文件在执行时会被javac编译成.class文件,即没有一个类就应当会有一个Class对象产生。而生成这个对象的机器就是由java虚拟机中的类加载器来加载的(启动类,扩展类,应用程序类,自定义类加载器)。所有的类都是在对其名列前茅次使用的时候动态加载到jvm中的。当程序调用一个类的静态成员时,类就会被加载(构造器就是一个类的静态方法)。类加载器首先会坚持这个类的Class对象是否已经加载。如果没有加载,那么默认的类加载器会去查找这个类的.class文件,在加载时会进行验证,查看是否含有不规范的代码(万一是黑客高手自己写的.class文件呢?)。一旦某个类的Class文件被放入内存,它就被用来创建这个来的所有对象。
以上就是关于Java RTTI和反射的区别的内容希望对大家有帮助。
猜你喜欢LIKE
相关推荐HOT
更多>>“指向二维数组内元素的指针”和“解引用数组的指针”有什么区别?
一、“指向二维数组内元素的指针”和“解引用数组的指针”的区别C语言中的二维数组是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后...详情>>
2023-10-11 22:20:32机器学习、深度学习和强化学习的关系和区别是什么?
一、机器学习、深度学习和强化学习的关系和区别机器学习Maching Learning,是实现人工智能的一种手段,也是目前被认为比较有效的实现人工智能的...详情>>
2023-10-11 20:53:27递推和递归的区别是什么?
一、递推和递归的区别1、从程序上看,递归表现为自己调用自己,递推则没有这样的形式。2、递归是从问题的最终目标出发,逐渐将复杂问题化为简单...详情>>
2023-10-11 20:24:02id选择器和类选择器的区别?
一、id选择器和类选择器的区别1、一个HTML标签只能应用于一个ID选择器。2、一个HTML标签可以应用多个class选择器。3、ID选择器是以“#”开头,...详情>>
2023-10-11 18:37:41热门推荐
易语言中的判断和如果命令有什么区别?
沸“指向二维数组内元素的指针”和“解引用数组的指针”有什么区别?
热网站数据库(oracle、mysql)以及各种编程语言(php、python、perl、lisp)的区别?
热不同环境和语言的正则表达式在使用上有什么区别?
新机器学习、深度学习和强化学习的关系和区别是什么?
递推和递归的区别是什么?
ftp主动模式和被动模式的区别?
group和team的区别?
id选择器和类选择器的区别?
java和c和HTML有什么区别?
Java与JavaScript有什么区别?
Java中的notify和notifyAll有哪些区别?
Java中抽象类和接口有哪些区别?
java微服务和分布式的区别?