一、介绍
使开发者能在运行时创建代理对象,这个代理对象可以拦截并增强原有对象的行为。相比于
静态代理来看,JDK动态代理为所有实例统一的创建代理对象,提高代码的可维护性。
二、使用
1.创建接口
public interface ICyclist { void bike(); }
2.创建实例
public class Cyclist implements ICyclist { @Override public void bike() { System.out.println("Cyclist ride on a bicycle"); } }
3.创建代理类,实现了InvocationHandler接口
public class JdkDynamicProxy implements InvocationHandler { Object obj; public Object bind(Object obj){ this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("热身..."); method.invoke(obj,args); System.out.println("拉伸..."); return null; } }
4.创建测试类
public class Test { public static void main(String[] args) { System.out.println("-----------------静态代理------------------------"); IRunner runner = new Runner(); ProxyClass proxyClass = new ProxyClass(runner); proxyClass.run(); System.out.println("-----------------JDK代理------------------------"); IRunner runner2 = (IRunner) new JdkDynamicProxy().bind(new Runner()); runner2.run(); ICyclist cyclist = (ICyclist) new JdkDynamicProxy().bind(new Cyclist()); cyclist.bike(); } }
5.输出
三、原理和缺点
1.java会在运行时生成一个源码文件
2.编译java字节码文件
3.通过反射创建实例
4.只能代理实现了接口的实例