动态代理设计模式
1、首先新建一个Usb接口类
/** * 便于程序扩展 */ public interface Usb { public void insert(String data); }
2、新建一个Usb2接口实现类
public class Usb2 implements Usb { @Override public void insert(String data) { System.out.println("usb2.0插入,data:"+data); } }
3、测试类
public class Test { public static void main(String[] args) { /** * 动态代理 * jvm允许在程序运行时动态为接口生成实现类对象(这里是usbProxy) * 类加载器(Test.class.getClassLoader()当前类的类加载器) */ Class<?>[] interfaces={Usb.class}; //目标对象 final Usb usbTarget=new Usb2(); Usb usbProxy = (Usb) Proxy.newProxyInstance(Test.class.getClassLoader(), interfaces, new InvocationHandler() { /** * proxy是由jvm动态生成的Usb接口的实现对象,调用该对象的任意(能够重写的方法)方法都会执行invoke函数 ② * @param proxy 这里为usbProxy * @param method 执行调用代理对象的方法 * @param args * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { ③ System.out.println("usb即将插入"); Object result = method.invoke(usbTarget, args); //method为proxy调用的add()方法,usbTarget为Usb2目标对象,args为传入的参数“this is data” System.out.println("usb插入成功"); return result; } });//创建代理对象 usbProxy.insert("this is data");//此处为动态生成的接口对象,调用接口中的方法 ① } }
4、执行测试类结果
usb即将插入
usb2.0插入,data:this is data
usb插入成功
小结: 1、 接口 由jvm动态生成proxy类
2、 接口 的实现类 为target目标类
3、 proxy类重写了接口的所有能够重写的方法(Object类中的final方法不重写),调用proxy对象的任意(能够重写的方法)方法都会执行invoke函数
4、invoke函数就相当于扩展了接口的功能,proxy的调用add()方法交给target目标类去处理。