《java编程思想系列之9》 类型信息

java是如何让我们在运行时候识别对象和类的信息的?
1)传统的RTTI:编译时候就已经知道了所有的类型
2)反射机制:允许我们在寻星的时候发现和使用类的信息

一、为什么需要RTTI

RTTI名字的含义:在运行时,识别一个对象的类型。

二、Class对象

所有的类都是在对其第一次使用的时候,动态加载到JVM中的。当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明构造器也是类的静态方法,即使在构造器之前并没有使用static关键字。



forName()的调用是为了它产生的“副作用”:如果类Gum还没有被加载就加载它。在加载的过程中,Gum的static子句被执行。

无论何时,只要你想在运行时候使用类型信息,就必须首先获得对恰当的Class对象的引用。Class.forName()就是实现此功能的便捷途径,因为你不需要为了获得Class引用而持有该类型的对象。


1)在传递给forName()的字符串中,你必须使用全限定名(包含包名)
2)up仅仅只是一个Class引用,在编译期不具备任何进一步的类型信息。当你创建新实例的时候,会得到Object引用,但是这个引用指向的是Toy对象。
3)使用newInstance()来创建的类,必须带有默认的构造器。

1、类字面常量

java还提供了另一种方法来生成对Class对象的引用,即使用类字面常量。如:
FancyToy.class;   

java取得Class对象引用:1)forName()方法  2)类字面常量

这样做不仅简单,而且更安全,因为它是在编译时候就会受到检查(因此不需要置于try语句块中),并且它根除了对forName()方法的调用,所以也更高效

类字面常量不仅可以应用于普通的类,也可以应用于接口、数组、以及基本数据类型。另外,对于基本数据类型的包装类,还有一个标准的TYPE。TYPE字段是一个引用,指向对应的基本数据类型的Class对象。

当使用.class来创建对Class对象的引用的时候,不会自动初始化该Class对象,为了使用类而做的准备工作实际包含三个步骤:
1)加载
2)链接
3)初始化

初始化被延迟到了对静态方法(构造器隐式的是静态的)或者非常数静态域进行首次引用的时候来执行:


2、泛化的Class引用

Class引用总是指向某个Class对象,它可以制造类的实例,并包含可以作用域这些实例的所有方法代码。它还包含该类的静态成员,因此,Class引用表示的就是它所指向的对象的确切类型,而该对象便是Class类的一个对象。

普通的类引用不会产生警告信息,你可以看到,尽管泛型类引用只能赋值为指向其声明的类型,但是普通的类引用可以被重新赋值为指向任何其他的Class对象。通过使用泛型语法,可以让编译器强制执行额外的类型检查。

在Java SE5中,Class<?>优于平凡的Class,即便它们是等价的,并且平凡的Class如你所见,不会产生编译器警告信息。Class<?>的好处是它表示你并非碰巧或者由于疏忽,而使用了一个非具体的类引用,你就是选择了非具体的版本。


向Class引用添加泛型语法的原因仅仅是为了提供编译期类型检查,因此如果你操作有误,稍后立即就会发现这一点。

当你将泛型语法用于Class对象的时候,会发生一件很有趣的事情:newInstance()将返回该对象的确切类型,而不仅仅只是在ToyTest。java中看到的基本的Object:

3、新的转型语法

Java SE5还添加了用于Class引用的转型语法,即cast()方法:


三、类型转换前先做检查

1)instance of
2)Class.isInstance

四、注册工厂

五、instanceof与Class的等价性


1)instanceof保持了类型的概念,它指的是“你是这个类吗?或者你是这个类的派生类吗?”
2)如果用==比较实际的Class对象,就没有考虑继承---它或者是这个确切的类型,或者不是。

六、反射:运行时候的类信息

七、动态代理

通过调用静态方法Proxy.newProxyInstance()可以创建动态代理,这个方法需要得到一个类加载器(你通常可以从已经被加载的对象中获取其类加载器,然后传递给它),一个你希望该代理实现的接口列表(不是类或者抽象类),以及InvocationHandle接口的一个实现。

八、空对象

九、接口与类型信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值