第十四章 类型信息
尼玛,刚刚看完了亚冠,恒大这样都被连扳3球,尼玛的垃圾孙祥,恨死了那个全北现代
好吧,回到学习上
运行时类型信息使得你可以再程序运行时发现和使用类型信息
本章讨论的是java如何让我们在运行时识别对象和类的信息,主要有两种方式,第一种是传统的rtti,它假定我们在编译时就已经知道了所有的类型,另外一种是反射机制,它运行我们在运行时发现和使用类的信息
.为什么需要rtti
rtti的含义:在运行时,识别一个对象的类型,在向上转型或者向下转型都需要用到的
.Class对象
要了解rtti在java中的工作原理,就必需了解类型信息在运行时是如何表示的,这个工作是由称为class对象的特殊对象完成的。,它包含了与类相关的信息,
每一个类都有一个class对象,保存在同名的class文件中,为了生成这个类的对象,运行程序的jvm会使用类加载器的子系统
所有类的第一次使用,都会动态的加载到jvm中,java是动态加载的,只有有需要的时候才会加载
一旦某个类的class对象被载入内存,他就被用来创建这个类的所有对象
两种方法获取class对象的引用,第一种class.forname
第二种是.getclass
注意的方法是newinstance,获取这个class对象的实例,但是必须要有默认构造器才行(也就是无参构造器)
.类字面常量
java提供了一个更加简便的方法来创建class的引用,那就是类字面常量,到底怎木用呢,就是直接,fancytoy.class还可以对接口,数组,基本数据类型,对于基本数据类型可以使用,Boolean.TYPE不过建议用.class
.class不会初始化类
为了使用类而坐的准备工作
1.加载,就是在字节码中创建一个class对象
2.链接,为静态域分配空间,有必要则解析该类创建的其他类的引用
3.初始化,也就是初始化静态的东西
.泛化的class引用
其实对于泛化的作用,我个人的看法就是,让一些本在运行时才能检查的错误,使他能在编译期时就被检查到
而对class对象也是有效的
例如integer继承number,但是class<number> aa=int.class是错误的,为什么呢
因为integer的class对象没有继承number的class对象
不过在这里我们可以使用通配符?
通配符的应该经常使用
例如class<?extends number> aa=int.class是对的
.cast
这是java5添加的用于class引用的转型语法,即cast方法
其实与之前的强制转型效果差不多,不过在无法强制转型的时候,可以使用cast方法
.类型转换前先做检查
我们已知的rtti(运行时类型识别)
1.传统的类型转换
2.代表对象的类型的class对象
3.注意 instanceof,返回值告诉我们对象是不是某个特定类型的实例
向下转型可以使用第三种进行检查
.使用类字面常量
比使用getclass与forname好
.动态的instanceof
class.isinstance方法提供了一种动态地测试对象的途径
.instanceof与class的等价性
instanceof与isinstance生成的结果是你是这个类吗或者是你是这个类的派生类吗
equals与==的意思是你是这个类还是不是
.反射:运行时的类信息
在rmi(远程方法调用),在编译时无法知道该对象的类型,故无法使用rtti,使用可以使用反射机制
class类与java.lang.reflect类库对反射机制进行了支持
rtti与反射机制的区别在于能否在编译期获取到class文件,即该对象的类型信息
.类方法提取器
调用class.forname(arg【0】)这main传入得参数,如何就可以使用c.getmethod等方法进行反射了
.动态代理
简单调用好处就是将不同的额外的操作从实际对象分离到不同地方,这样修改起来就很方便
动态代理,这个在设计模式里面将为大家详解
.空对象
就是减少了检查null的枯燥,我个人觉得使得空也称为了不是特例,而是成为了一个真正的普通对象
与动态代理一起弄的地方还没有看明白,迟点写出了
.模拟对象与桩
空对象的逻辑变体就是模拟对象和桩
模拟对象往往是轻量级和自测试的
桩是重量级的,通过配置进行修改,是复杂对象
.接口与类型信息
interface的作用无非就是让程序隔离构件,减低耦合性,但是通过类型信息,耦合性仍然是被传播了出去
例如 A a=new B() B实现A接口
if(a instanceof B){B b=(B)a;b.g();}
这样就耦合度就郑家了
解决方法1.直接声明
也就是使用包权限访问+控制构造对象,因为包的外表没有任何c类型可以用,所以不能转型为c
但是反射机制仍然可以访问这些,甚至是private
看起来真的声明都无法阻止反射机制去访问这些内容
利用反射机制可以访问后门?
这一章真的挺难理解的,因为没去上课,都是自己看书的,哎,有老师真好
不过我觉得这一章的亮点在于反射机制,给了我们新的一条路
注:java的反射机制详解 http://baike.baidu.com/view/1865203.htm