使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。
day045 代理(何时使用代理、创建代理对象、代理类的特性)
利用代理可以在运行时创建一个实现了一组给定接1J的新类:这种功能只有在编译时无法确定需要实现哪个接U时才冇必要使用。
1.何时使用代理
假设有一个表示接口的Class对象(有可能只包含一个接口),它的确切类型在编译时无法知道。这确实有些难度。要想构造一个实现这些接口的类,就需要使用newlnstance方法或反射找出这个类的构造器。但是,不能实例化一个接口,需要在程序处于运行状态时定义一个新类。
为了解决这个问题,有些程序将会生成代码;将这些代码放置在一个文件中;调用编译器;然后再加载结果类文件。很自然,这样做的速度会比较慢,并且需要将编译器与程序放在一起。而代理机制则是一种更好的解决方案。代理类可以在运行时创建全新的类。这样的代理类能够实现指定的接口。尤其是,它具有下列方法:
•指定接口所需要的全部方法。
•Object类中的全部方法,例如,toString、equals等。
然而,不能在运行时定义这些方法的新代码。而是要提供一个调用处理器(invocationhandler)。调用处理器是实现了InvocationHandler接口的类对象。在这个接口中只有一个方法:
Object invoke(Object proxy, Method method, Object[] args)
无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数。调用处理器必须给出处理调用的方式。
2.创建代理对象
要想创建一个代理对象,需要使用Proxy类的newProxylnstance方法。这个方法有三个参数:
•一个类加栽器(classloader)。作为Java安全模型的一部分,对于系统类和从因特网上下载下来的类,可以使用不同的类加载器。
•一个Class对象数组,每个元素都是需要实现的接口。
•一个调用处理器。