publicclassProxyFactoryimplementsInvocationHandler{privateClasstarget;privateObjectreal;//委托类class publicProxyFactory(Classtarget){this.target=target;}//实际执行类bind publicObjectbind(Objectreal){this.real=real;//利用JDK提供的Proxy实现动态代理 returnProxy.newProxyInstance(target.getClassLoader(),newClass[]{target},this);}@OverridepublicObjectinvoke(Objecto,Methodmethod,Object[]args)throwsThrowable{//代理环绕 System.out.println("begin");//执行实际的方法 Objectinvoke=method.invoke(real,args);System.out.println("end");returninvoke;}publicstaticvoidmain(String[]args){Calculatorproxy=(Calculator)newProxyFactory(Calculator.class).bind(newCalculator.CalculatorImpl());proxy.add(1,2);}}
利用JDK的proxy实现代理动态代理,有几个关键点,一个就是InvocationHandler接口,这个方法中的invoke方法是执行代理时会执行的方法。所以我们所有代理需要执行的逻辑都会写在这里面,invo参数里面的method可以使用java 反射调用真实的实现类的方法,我们在这个方法周围做一些代理逻辑工作就可以了。上面的代码会把Calculator接口的所有方法全部在程序运行时代理。不用我们一个个的去写静态代理的方法。
JDK动态代理的原理
先看Proxy.newProxyInstance(...)方法中的具体实现(省略大部分方法)。在下面的代码中会通过getProxyClass0(…)方法得到class对象,然后给把InvocationHan