能夠在運行時修改類,這樣能夠用聲明的方式來編程(對別的代碼實現無侵入式編程)。
如:java
就是能夠在xml文件或者什麼地方聲明下,便可實現對什麼包或者以service結尾的的類的全部方法先後添加其餘的操做。編程
我這就那開發者來舉例吧函數
一個開發者的接口測試
/** * @since cl @ 2019-06-19 10:26 * 開發者 */ public interface Developer { void code(); void debug(); }
實現一個java開發者的類this
/** * @since cl @ 2019-06-19 10:27 * Java開發者 */ public class JavaDeveloper implements Developer{ private String name; public JavaDeveloper(String name) { this.name = name; } public void code() { System.out.println(name+" doing code..."); } public void debug() { System.out.println(name+" doing debug..."); } }
/** * @since cl @ 2019-06-19 10:30 */ public class JavaDeveloperHandler implements InvocationHandler { Object object; public JavaDeveloperHandler(Object object) { this.object = object; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("聽音樂...."); method.invoke(object,args); System.out.println("打遊戲...."); return null; } }
/** * @since cl @ 2019-06-19 14:31 */ public class DynamicProxyMain { public static void main(String[] args) { JavaDeveloper tomDeveloper = new JavaDeveloper("Tom"); JavaDeveloperHandler handler = new JavaDeveloperHandler(tomDeveloper); Developer tomDeveloperProxy = (Developer)Proxy.newProxyInstance(tomDeveloper.getClass().getClassLoader(), tomDeveloper.getClass().getInterfaces(),handler); tomDeveloperProxy.debug(); tomDeveloperProxy.code(); } }
《碼農翻身》-Java帝國之動態代理
https://www.jianshu.com/p/95970b089360
https://www.cnblogs.com/maybo/p/5193843.htmldebug