我理解的动态代理就是,被代理类是不确定的,所以这是需要一个代理器,把需要代理的类,就是被代理类放入到代理器中,我们需要的一些重复操作让代理器帮我们做就可以了。就比如我们买房子的时候,我们需要中介,这个中介就是一个代理类,我们就是被代理类。但是有好多好多中介,这是我们就是所有的中介何为一个代理中介,就是一个代理器,我们把我么你想要做的事全部放到代理器中,一些所有的重复操作就不用再做了。所以在动态代理中我们需要代理器、被代理类这两个类。下面简单的实现了动态代理的代码。
package com.an.test.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestDynamicProxy {
public static void main(String[] args) {
//1.被代理类的对象
RealSubject real = new RealSubject();
//2.创建了一个实现了InvocationHandler接口的类的对象,处理器
MyInvocationHandler handler = new MyInvocationHandler();
// 调用blind()方法,动态的返回一个同样实现了real所在类实现的接口
// Subject的代理类的对象
Object obj = handler.blind(real);
Subject sub = (Subject) obj;
sub.action();
}
}
interface Subject{
public void action();
}
class RealSubject implements Subject{
@Override
public void action() {
System.out.println("我是被代理类....");
}
}
//处理器
class MyInvocationHandler implements InvocationHandler{
Object obj;//实现了接口的被代理类的对象的声明
//①给被代理类的对象实例化
//②返回一个代理类的对象
//绑定被代理类的对象
public Object blind(Object obj){
this.obj = obj;
//第一个参数为被代理类 加载器
//第二个参数是被代理类所实现的接口
//第三个参数是被对象.处理器
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
//当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下invoke方法的调用
//invoke是JVM调用的
//这里的method就是被代理类的方法,args就是被代理类的方法的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("start");
Object returnVal = method.invoke(obj, args);//这里的方法和方法的参数是动态的,所以体现出动态代理的思想
System.out.println("end");
return returnVal;
}
}