动态代理模式:解决了静态代理模式的缺点(无需创建多个代理类)
/**
* 抽象角色 租房的动作* */
public interface ITrueHouse {
void request();
}
/**
* 真实房屋拥有者,最终调用的方法
* */
public class House implements ITrueHouse {
public void request() {
System.out.println("房子是我的!");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 动态代理角色 必须实现InvacationHandler接口
* */
public class DynamicProxy implements InvocationHandler {
//定于最终执行的类
private Object sub;
public DynamicProxy(Object obj){
this.sub=obj;
}
/**
* method 当前需要执行的方法(其实是有调用方决定的) args调用该方法需要的参数数组
* */
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
getMoney();
method.invoke(sub, args);//执行该方法 sub表示最终执行的实例
return null;
}
private void getMoney(){
System.out.println("我是中介,我要收中介费");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
House h=new House();
InvocationHandler invocation=new DynamicProxy(h);//实例化代理类
Class<?> classType=invocation.getClass();//获取代理类的class对象
ITrueHouse sub=(ITrueHouse)Proxy.newProxyInstance(classType.getClassLoader(),
h.getClass().getInterfaces(), invocation);//返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
sub.request();
}
}