什么是代理
代理是基本的设计模式之一,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。
通过使用代理,通常有两个优点:
- 可以隐藏委托类的实现。
- 可以实现客户与委托类间的解耦,在不修改委托类代码的情况下能够做一些额外的处理。
如果不知道某个对象的确切类型,RTTI
可以告诉你。但是有一个限制:这个类型在编译时必须已知,这样才能使用RTTI
识别它。换句话说,在编译时,编译器必须知道所有要通过RTTI
来处理的类。
反射允许运行中的Java程序获取自身的信息,并且可以操作类或对象的内部属性。
Class
类和java.lang.reflect
类库一起对反射的概念进行了支持,该类库包含了Field
、Method
以及Constructor
类。这些类型的对象是由JVM
在运行时创建的,用以表示未知类里对应的成员。这样你就可以使用Constructor
创建新的对象,用get()
和set()
方法读取和修改与Field
对象关联的字段,用invoke()
方法调用与Method
对象关联的方法。另外,还可以调用getFields()
、getMethods()
和getConstructors()
等很便利的方法,以返回表示字段、方法以及构造器的对象的数组。这样,匿名对象的类信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。
运行时类型信息(Runtime Type Information
,RTTI
)使得你可以在程序运行时发现和使用类型信息。Java在运行时识别对象和类的信息,主要有两种方式:一种是传统的RTTI
,它假定我们在编译时已经知道了所有的类型;另一种是反射机制,它允许我们在运行时发现和使用类的信息。
RTTI的形式包含:
(Shape)
”,由RTTI确保类型转换的正确性,如果执行了一个错误的类型转换,就会抛出一个ClassCastException
异常。Class
对象。通过查询Class
对象可以获取运行时所需的信息。instanceof
。它返回一个布尔值,告诉我们对象是不是某个特定类型的实例。String
对象是不可变的,String
类中每一个看起来会修改String
值的方法,实际上都是创建了一个全新的String
对象,以包含修改后的字符串内容,而最初的String
对象则丝毫未动。
1 | public class Immutable { |
Throwable
类被用来表示任何可以作为异常被抛出的类。从Throwable
继承可分为两种类型:Error
用来表示编译时和系统错误,一般不用关心;Exception
是可以被抛出的的基本类型,通常是程序员所关心的。Exception
又可以分为受检查的异常和未受检查的异常,未受检查的异常也叫运行时异常,受检查的异常必须要处理。