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和反射的区别的内容希望对大家有帮助。
相关推荐HOT
更多>>字符集和编码方式的区别?
一、字符集和编码方式的区别字符集:多个字符的集合。例如GB2312是中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号、序...详情>>
2023-10-20 19:26:54黑客和编程有什么区别?
一、黑客和编程的区别1.很多程序员都是科班出身,而黑客大多数都是靠兴趣去自学的;2.程序员是解决软件或硬件问题,黑客则做一些网络的工作。比...详情>>
2023-10-20 16:30:30什么是微软Azure?
一、什么是微软AzureMicrosoft Azure是微软提供的基于云的平台和服务,允许通过微软管理的数据中心的全球网络开发、部署和管理应用程序和服务...详情>>
2023-10-20 14:46:55云控跟群控有什么区别?
一、云控跟群控的区别1. 控制手机数量云控:一台电脑就可以控制1-20000部手机同时运行,通过阿里云服务器传输任务,手机和手机之间不需要任何连...详情>>
2023-10-20 14:21:23