在java中rtti是什么(java中传统的RTTI和反射的区别是什么)
大家好,今天来为大家解答在java中rtti是什么这个问题的一些问题点,包括java中传统的RTTI和反射的区别是什么也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
C++中有rtti机制吗
楼上两个都在搞笑。第一个谈java文不对题;第二个根本没搞清楚什么叫做RTTI,你那叫多态,和RTTI还差得远呢。
RTTI,运行时类型信息,代表你可以在运行时动态获取某个类型的信息。
C++支持RTTI,但是支持的很有限。而且许多C++编译器默认是不打开RTTI的,需要手工指定(比如VC6.0的编译器)
C++的RTTI只提供了几个最基本的功能:
1、安全的downcast,当你使用dynamic_cast动态从基类指针转换成子类指针的时候,RTTI能保证安全的转换,如果类型不符则抛出一个bad_cast异常。
2、动态获取一个对象的类名称。你可以使用typeid获得一个type_info对象,这个对象保存了这个类型的最基本信息,比如名称。
3、在继承树上遍历,使用typeid获得的type_info对象提供一个before方法,可以用于查找这个类型的基类。
其它更复杂的比如反射和动态类型扩充等功能C++都没有提供支持。而且即使是C++标准规定的以上那些基本功能,不同的编译器实现都有较大的差异,有些编译器实现的不是很好。
总之,C++是一个强调静态特性的语言,而动态特性则相对弱很多,和后来那些纯OOP语言比如java、C#、JS、Python等比起来,动态特性是很不值一提的。
所以实际项目中使用C++的RTTI也非常少,最多就是使用它的dynamic_cast来进行安全的向下转换了,别的方面基本上都不用。
java中传统的RTTI和反射的区别是什么
在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型;还有一种,是利用反射机制,在运行时再尝试确定类型信息。
严格的说,反射也是一种形式的RTTI,不过,一般的文档资料中把RTTI和反射分开,因为一般的,大家认为RTTI指的是传统的RTTI,通过继承和多态来实现,在运行时通过调用超类的方法来实现具体的功能(超类会自动实例化为子类,或使用instance of)。
传统的RTTI有3种实现方式:
向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父类转成子类)需要强制类型转换
Class对象(用了Class对象,不代表就是反射,如果只是用Class对象cast成指定的类,那就还是传统的RTTI)
instanceof或isInstance()
传统的RTTI与反射最主要的区别,在于RTTI在编译期需要.class文件,而反射不需要。传统的RTTI使用转型或Instance形式实现,但都需要指定要转型的类型,比如:
public void rtti(Object obj){Toy toy= Toy(obj);// Toy toy= Class.forName("myblog.rtti.Toy")// obj instanceof Toy}
注意其中的obj虽然是被转型了,但在编译期,就需要知道要转成的类型Toy,也就是需要Toy的.class文件。
相对的,反射完全在运行时在通过Class类来确定类型,不需要提前加载Toy的.class文件。
反射
那到底什么是反射(Reflection)呢?反射有时候也被称为内省(Introspection),事实上,反射,就是一种内省的方式,Java不允许在运行时改变程序结构或类型变量的结构,但它允许在运行时去探知、加载、调用在编译期完全未知的class,可以在运行时加载该class,生成实例对象(instance object),调用method,或对field赋值。这种类似于“看透”了class的特性被称为反射(Reflection),我们可以将反射直接理解为:可以看到自己在水中的倒影,这种操作与直接操作源代码效果相同,但灵活性高得多。
关于Java的反射API,没必要去记忆,可以在任何JDK API中查询即可
JAVA中反射是什么
JAVA中反射是动态获取信息以及动态调用对象方法的一种反射机制。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态语言的一个关键性质。
Java反射的功能是在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。
扩展资料:
JAVA中反射实例:
1、Class superClass=clazz.getSuperclass();//获取父类。
System.out.println("getSuperclass:"+superClass)。
2、Class[] interfaces=clazz.getInterfaces();//获取实现接口。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors();//构造方法。
System.out.println("getConstructors:"+cons.length)。
参考资料来源:百度百科: JAVA反射机制
java中提供了两种动态机制分别是
反射机制和动态代理
反射机制:运行时信息(RunTime Type Information,RTTI)使得可以在程序运行时发现和使用类型信息。RTTI主要用来运行时获取向上转型之后的对象到底是什么具体的类型。
动态代理:所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时必须提供一组interface给它,然后该class就宣称它实现了这些 interface。当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时必须提供一个handler,由它接管实际的工作
JAVA自带的动态代理是基于java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler两个类来完成的,使用JAVA反射机制
文章分享结束,在java中rtti是什么和java中传统的RTTI和反射的区别是什么的答案你都知道了吗?欢迎再次光临本站哦!