一文瞭解Java動態代理的原理及實現
代理是指:某些場景下對象會找一個代理對象,來輔助自己完成一些工作,如明星的經紀人、買房的人找房產中介等。
代理主要是對對象的行為額外做一些輔助操作。
如何創建代理對象:
Java中代理的代表類是:Java.lang.reflect.Proxy
Proxy提供瞭一個靜態方法,用於為對象產生一個代理對象返回
主類:
public class Test { public static void main(String[] args) { //1、創建一個類,對象類必須實現接口 star s=new star("小明"); //為小明這個明星對象生成一個代理對象(經紀人) skill s2=StarAgentProxy.getProxy(s); s2.sing();//走代理的 s2.jump(); //運行結果: //代理開始 //小明開始唱歌 //代理結束 //代理開始 //小明開始跳舞 //代理結束 } }
明星類(對象類):
//明星類 public class star implements skill{ private String name; public star(String name) { this.name = name; } //重寫方法 public void jump(){ System.out.println(name+"開始跳舞"); } public void sing(){ System.out.println(name+"開始唱歌"); } }
行為接口類:
//行為類 public interface skill { void jump();//跳舞 void sing();//唱歌 }
代理類:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //代理類 public class StarAgentProxy { //定義一個方法來返回一個明星對象的代理對象 public static skill getProxy(star obj){ //為小明這個對象生成一個代理對象 /* public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, 對象實現的接口列表 InvocationHandler h) */ return (skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理開始"); //真正的讓小明去唱歌、跳舞 //method==>正在調用的方法對象, args==>代表這個方法的參數 Object rs=method.invoke(obj,args); System.out.println("代理結束"); return rs; } }); } }
實現步驟:
1、必須存在接口
2、被代理的對象需要實現接口
3、使用Proxy類提供的方法得到對象的代理對象
通過代理對象調用方法,執行流程是什麼樣的?
1、先走向代理
2、代理可以為方法額外做一些輔助工作
3、開始真正觸發對象的方法的執行
4、回到代理中,由代理負責返回結果給方法的調用者
優化代碼的關鍵步驟:
1、必須有接口,實現類要實現接口(代理通常是基於接口實現的)
2、創建一個實現類的對象,該對象為業務對象,緊接著為業務對象做一個代理對象
動態代理的優點:
1、可以在不改變方法源碼的情況下,實現對方法功能的增強,提高瞭代碼的復用
2、簡化瞭編程工作、提高瞭開發效率,同時提高瞭軟件系統的可拓展性
3、可以為被代理對象的所有方法做代理
4、非常靈活,支持任意接口類型的實現類對象做代理,也可以直接為接口本身做代理
為任意接口類型的實現類對象做代理的框架(運行泛型)
public static <T> T get(T obj){ return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return null; } }); }
到此這篇關於一文瞭解Java動態代理的原理及實現的文章就介紹到這瞭,更多相關Java動態代理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!