代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能
代理分为两种,一种是静态代理类,一种是动态代理类
一.静态代理
使用方法:静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。
- 定义接口A
- 定义目标对象类B实现接口A
- 定义代理对象C实现接口A
其中3中又涉及如下步骤:
- 定义接收保存目标对象
- 扩展目标对象功能
举个例子
public interface Rent {
void rent();
}
public class Host implements Rent {
public void rent() {
System.out.println("----租房----");
}
}
public class Proxy implements Rent{
//接收保存目标对象
private Rent rent;
public Proxy(Rent rent){
this.rent=rent;
}
public void rent() {
System.out.println("开始看房...");
rent.rent();//执行目标对象的方法
System.out.println("租房成功...");
}
}
public class App {
public static void main(String[] args) {
//目标对象
Host host = new Host();
//代理对象,把目标对象传给代理对象,建立代理关系
Proxy proxy = new Proxy(host);
proxy.rent();//执行的是代理的方法
}
}
二.动态代理
1.代理对象不需要实现接口,但是目标对象一定要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理(
- 一个处理者的类设计必须实现java.lang.reflect.InvocationHandler接口.
- 通过InvocationHandler接口实现的动态代理只能代理接口的实现类.
)
JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
注意该方法是在Proxy类中是静态方法,且接收的三个参数依次为:
ClassLoader loader,
:指定当前目标对象使用类加载器,获取加载器的方法是固定的Class<?>[] interfaces,
:目标对象实现的接口的类型,使用泛型方式确认类型InvocationHandler h
:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入