详细解析动态代理模式的实例:
1. 首先完成一个接口的创建(里面有真正的想要实现的方法):
publicinterface Subject {
publicvoid request();//想要实现的方法
}
2. 写一个真实的主题类实现Subject接口(并实现其中的方法):
publicclass RealSubject implements Subject {
publicvoid request() {//实现接口中的方法
System.out.println("真实的主题的实现的方法");
}
}
3. 写一个动态的代理类实现InvocationHandler接口:
//动态的代理类应该实现的是InvocationHandler接口(在java.lang.reflect包下)
publicclass Proxyhandle implements InvocationHandler {
Object obj = null;
//写一个绑定的方法,绑定不同的接口进行代理
public Object bind(Object obj){
this.obj = obj;
//该方法的返回值是一个对象
//Proxy有一个方法newProxyInstace();有三个参数:第一个:表示所代理的真实类类的实例的类的加载器
//第二个参数表示是:所要代理的真实类所实现的接口
//第三个是:代理类本身
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
//InvocationHandler接口中的方法invoke()
//invoke()之中的method就是表示真实类中实现接口中的那个方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//调用参数method中的invoke()方法,其中有两个参数
//第一个参数表示:代理的真实类
//第二个参数表示:传入的参数对象数组
System.out.println("代理之前的任务~~~");
Object o = method.invoke(this.obj, args);
System.out.println("代理之后的任务~~");
return o;//返回一个所代理的接口的实现类
}
}
4. 测试动态代理的类:TestProxy
public class TestProxy {
public static void main(String args[]){
Proxyhandle ph = new Proxyhandle();//拿到代理类的对象
//绑定代理的真实的主题对象
Subject sub = (Subject) ph.bind(new RealSubject());//将真实主题与代理进行绑定
sub.request();//调用真实对象的request(是实现接口中的方法)
//这时候代理类中的invock()方法将会被自动调用完成代理过程
}
//代理不同的真实类的话就直接改变bind()方法中的参数,传入你想要代理的真实类就ok
//这样就实现了动态的代理了
}
这样四步就完成来了一个动态代理的实例,每一步在代码中都有解释