文章目錄
- 1. 簡介
- 2. 代碼
- 3. 參考鏈接
1. 簡介
代理類在程序運行時創建的代理方式被成為動態代理。在靜態代理中,代理類(RenterProxy)是自己已經定義好了的,在程序運行之前就已經編譯完成。而動態代理是在運行時根據我們在Java代碼中的“指示”動態生成的。動態代理相較于靜態代理的優勢在于可以很方便的對代理類的所有函數進行統一管理,如果我們想在每個代理方法前都加一個方法,如果代理方法很多,我們需要在每個代理方法都要寫一遍,很麻煩。而動態代理則不需要。
spring 中aop便是基于代理進行的
2. 代碼
需要代理的用戶
一個大明星
public class BigStar implements Star{private String name;public BigStar(String name){this.name = name;}public String sing(String name){System.out.println(this.name + "在唱" + name);return "謝謝!!!";}public void dance(){System.out.println(this.name + "跳舞!!!");}
}
遵守規則,寫個接口
public interface Star {String sing(String name);void dance();
}
我是代理工廠
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static Star createProxy(BigStar bigStar){/** public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)*/Star starProxy = (Star)Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(method.getName().equals("sing")){System.out.println("準備話筒,收錢");}else if(method.getName().equals("dance")){System.out.println("場地準備中。。。收錢。。。");}return method.invoke(bigStar, args);}});return starProxy;}
}
測試類
public class Test {public static void main(String[] args) {BigStar bigStar = new BigStar("岳軒子");Star starProxy = ProxyUtil.createProxy(bigStar);String rs = starProxy.sing("恭喜發財");System.out.println(rs);starProxy.dance();}
}
運行結果:
準備話筒,收錢
岳軒子在唱恭喜發財
謝謝!!!
場地準備中。。。收錢。。。
岳軒子跳舞!!!
3. 參考鏈接
java動態代理
【黑馬磊哥】Java動態代理深入剖析,真正搞懂Java核心設計模式:代理設計模式