java RTTI 之二

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>   hot3.png

       RTT(IRuntime Type Information”的缩写),意思是:运行时类型信息。其对应的类是Class对象,每个java类都对应一个Class对象(在编写并且编译后),这个对象被保存在这个类的同名class文件里。
       类加载器在类被第一次静态调用(比如一个静态方法,一个静态代码块或者new关键字调用构造器,注意contructors其实都是静态的)时,会把那个对应的Class对象加载到内存中。

      获取类的class对象引用的方式如下:
    (1)Class类中static方法是forName。Class.forName(String className);通过这个静态方法返回一个对类的Class对象的引用,用户可以在运行时动态得到大量关于这个类的信息,包括接口,父    类,方法,静态成员,甚至是像newInstance()方法这样的一个实现“虚拟构造器”的一种方式。所谓的虚拟构造器,就是声明“我不知道你的确切类型,至少在编译期不知道,但是我就是要正确的创建你的一个对象”。
比如说c是某个类的Class对象
Class superc = c.getSuperClass();
Object obj = null;
obj = c.newInstance();
毫无疑问,这个obj实际指向的对象是c的父类的一个对象。
鉴于java的单继承模式,这个父类显然是唯一确定的,尽管在编译时我完全不知道它的类名。

    (2)Java提供的另外一种更加安全的得到Class类的对象的方式是,使用类字面常量。classname.class;

   (3)Java在RTTI中的第三种形式是最常见的。就是instanceof关键字,用法就不多说了。该关键字的调用其实就是使用了Class对象,并且返回一个布尔值。如果说instanceof和Class的比较唯一的不同,那就是instanceof如果是其子类的对象也会返回true,而Class对象比较的会是确切的那个类型。
这样得到类的Class对象可以在编译器就得到检查。
RTTI的限制?显然它必须知道一个非常重要的东西:类名(甚至是全类名)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值