静态代理
以租房为示例,不废话上代码
创建租房接口
public interface Rent {
public void rent();
}
创建房东类
//房东
public class Host implements Rent{
public void rent() {
System.out.println("房东要出租房子");
}
}
创建代理对象
public class Proxy implements Rent{
private Host host;
public Proxy() {
}
public Proxy(Host host) {
this.host = host;
}
public void rent() {
seeHouse();
host.rent();
hetong();
fare();
}
// 看房
public void seeHouse(){
System.out.println("中介带你看房");
}
// 收中介费
public void fare(){
System.out.println("收中介费");
}
// 签租赁合同
public void hetong(){
System.out.println("签租赁合同");
}
}
代码测试
public class Client {
public static void main(String[] args) {
// 房东要租房子
Host host=new Host();
// 代理,中介帮房东租房子,但是呢?代理角色一般会有一些附属操作!
Proxy proxy = new Proxy(host);
// 你不用面对房东,直接找中介租房即可!
proxy.rent();
}
}
执行结果
中介带你看房
房东要出租房子
签租赁合同
收中介费
动态代理
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
需要了解两个类:proxy代理、InvocationHandler调用处理程序
基于接口---JDK原生动态代理
创建租房接口
public interface Rent {
public void rent();
}
创建房东类
public class Host implements Rent {
public void rent() {
System.out.println("房东要出租房子");
}
}
创建测试类
public class Client {
public static void main(String[] args) {
final Rent host = new Host();
Rent proxy =(Rent) Proxy.newProxyInstance(host.getClass().getClassLoader(), host.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
System.out.println("中介带你看房");
Object invoke = method.invoke(host, args);
System.out.println("签租赁合同");
return invoke;
}
});
proxy.rent();
}
}
执行结果
中介带你看房
房东要出租房子
签租赁合同
说明一下Proxy对象的newProxyInstance方法
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
-
:指定当前目标对象使用类加载器,获取加载器的方法是固定的ClassLoader loader,
-
:目标对象实现的接口的类型,使用泛型方式确认类型Class<?>[] interfaces,
-
:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入InvocationHandler h
还有其中 InvocationHandler 接口的 invok 方法
public Object invoke(Object proxy, Method method, Object[] args)
-
:就是代理对象,newProxyInstance方法的返回对象Cproxy,