Java编程思想之类型信息

1.     运行时类型信息使得可以在程序运行的时候发现和使用类型信息。主要包括两种方式:第一种就是RTTI,假定编译时已经知道所有类型,主要用在多态,类型转换;另一种是反射,允许在运行时才发现和使用类的信息。

2.     从List中取出某特定类型,首先通过容器和泛型来包装在编译时能够从object类转型成基类,而在运行时,通过类型转换来转成特定类型。

3.     Class对象包含于类有关的信息,每个类只有一个,并用来创建类的所有实例对象。Class对象被保存在编译后的同名.class文件中。

4.     通过Java虚拟机的类加载器子系统,即一条类加载器链,来生成对象。原生类加载器加载的是本地的类,如果有特殊要求,可以挂架额外的类加载器。

5.     所有类在对其第一次使用时,会动态加载到JVM中。类加载器首先检查这个类的Class对象是否已加载,如果没有,默认的类加载器就会根据类名查找.class文件。在这个字节码被加载时,会接受验证,以确保安全性。一旦某个类的Class对象被载入内存,就被用来创建这个类的所有对象。

6.     Class.forName(“目标类名”)返回Class对象的引用,要放入try块中,但在编译期时不具备任何更进一步的类型信息,副作用:如果此类还没加载就加载它。在加载的过程中,static字句就会被执行。对Class对象调用newInstance()方法实现虚拟构造器,会创建object型的实例对象。使用newInstance()方法必须带有默认的构造器。

7.     可以有类字面常量生成对Class对象的引用。因为它会在编译期被检查,所以不需置于try块中。当使用.class格式来创建对Class对象的引用时,不会自动初始化Class对象。

8.     使用类的准备工作:首先是加载,由类加载器执行,创建Class对象。其次是链接,为静态域分配存储空间和解析这个类创建的对其他类的所有引用。最后是初始化,超类初始化,执行静态初始化器和静态初始化块。初始化被延迟到对静态方法或非常数静态域进行首次调用时才执行。

9.     如果static final值是编译期常量,则此值不需要对所属类进行初始化就能被读取。但如果不是编译期常量,当访问该值时,会强制所属类的初始化。如果一个static域不是final的,那么在对它返回时,要先进行链接(为这个域分配存储空间)和初始化(初始化该存储空间)。

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

11.  通过使用Class泛型引用语法Class<>,让编译器对Class引用强制执行类型检查。当将泛型语法用于Class对象时,newInstance()会返回该对象的确切类型。当如果使用类似于Class<? super 类名>语法,由于含糊,newInstance()返回Object类型。

12.  Class引用的转型语法,cast()方法。

13.  RTTI形式:

1).传统的类型转换,由RTTI确保类型转换的正确性。

2).代表对象的类型的Class对象,通过查询Class对象可以获取运行时所需的信息。

3).关键字instanceof,返回布尔值,告诉我们对象是不是某个特定类型的实例。

14. Instanceof只能与命名类型比较,而不能与Class对象比较。Class.isInstance方法提供了动态测试对象的途径。类对象.isInstance(实例对象)。

15. 若A,B类是继承关系的,则Class<A>和Class<B>对象没有继承关系。

16. 反射用于在编译期不知道类的信息,而在运行期获取外界类的信息的情形。

17. Class类和java.lang.reflect类库对反射概念进行了支持,该类库包含的内部类的对象用来表示对未知类中对应的成员。

18. RTTI和反射真正的区别:对RTTI来说,编译器在编译的时候打开和检查.class文件来加载Class对象。而反射机制来说,.class文件在编译时不可获取,所以在运行时打开和检查.class文件。

19. Class,forName(args[0])生成的结果在编译时是不可知的。

20. 代理:作为中介角色,来把来自外界的信息传输给类内部的实际动作的真正实现者。

21. 动态代理可以动态地创建代理并动态地处理对所代理方法的调用,在动态代理商所做的所有调用都会被重定向到单一的调用器上,工作是揭示调用的类型并确定相应的决策。创建动态代理需要三个参数,第一个参数就是类加载器,用来创建代理对象,第二个是希望该代理实现的接口列表,第三个参数是InvocationHandler接口的一个实现。动态代理可以将所有调用重定向到调用处理器,因此通常会向调用处理器的构造器传递一个实际工作的对象引用,从而使得调用处理器在执行其中介任务时,可以将请求转发。主要作用,还是在不修改被代理对象(实际工作对象)的源码上,进行功能的增强。

22. 当对代理对象调用方法时,先把请求转发给调用处理器,调用处理器接着把请求转发给实际工作对象。

23.  空对象可以接受传递给它的所代表对象的信息,但将返回表示为实际上并不存在任何真实对象的值。空对象最有用之处在于它更靠近数据,因为对象表示的是问题空间内的实体。用空对象测试是否为空的最简单方式是创建一个标记接口Null, 用instanceof可以探测空对象。

24. 通过使用反射,可以到达并调用所有方法,甚至是private方法如果知道方法名,就可以在method对象上调用setAccessible(true)。没有任何方式可以阻止反射到达并调用那些非公共访问权限的方法。系统运行时,final域会在不抛出异常的情况下接受任何修改尝试,但实际上不会发生任何修改。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值