个人理解的动态代理
//动态代理,无非就是将静态代理中的shop商家,换成了一个大的购物中心(购物中心里面什么都有,兼容度度比单纯的shop商家好多了, 用户不用满大街跑了,一站式搞定),进入的用户千变万化,但是大的购物中心能根据每个用户吃的前后做一些用户不需要主动知道的操作。
1 //动嘴吃 2 public interface eat{ 3 String eat(String food); 4 String drink(String water); 5 } 6 //每个用户都会吃 7 public static class people implements eat{ 8 String name=""; 9 public people(String name){ 10 this.name=name; 11 } 12 @Override 13 public String eat(String food) { 14 System.out.println(name+"开始吃"+food+"ing...."); 15 return "吃完了准备结账"; 16 } 17 18 @Override 19 public String drink(String water) { 20 System.out.println(name+"开始喝"+water+"ing...."); 21 return "喝多了,准备酒驾逃跑"; 22 } 23 } 24 25 /** 26 * 动态代理 27 */ 28 public static class ProxyTest implements InvocationHandler{ 29 // 目标对象 30 private Object targetObject; 31 //传入实现类,返回对应的接口,被实现的接口 obj = (被实现的接口) proxy.newProxyInstance(实现类); 32 public Object newProxyInstance(Object targetObject){ 33 this.targetObject=targetObject; 34 return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(),this); 35 } 36 /** 37 * @param proxy 代理的对象 38 * @param method 代理的方法 39 * @param args 调用方法时传入的参数 40 * @return 41 * @throws Throwable 42 */ 43 @Override 44 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 45 Object res=null; 46 try{ 47 System.out.println("商家接到点的菜,开始制作"); 48 //调用eat方法 49 res=method.invoke(targetObject, args);//res=eat方法的返回值 50 System.out.println("吃完了,商家要债来了"); 51 }catch(Exception e){ 52 e.printStackTrace(); 53 System.out.println("地沟油,被查封了"); 54 throw e; 55 } 56 return res; 57 } 58 59 } 60 public static void main(String[] args) { 61 ProxyTest proxy=new ProxyTest(); 62 eat obj = (eat) proxy.newProxyInstance(new people("张三")); 63 String res = obj.eat("油条"); 64 System.out.println(res); 65 String drink = obj.drink("工业酒精"); 66 System.out.println(drink); 67 }