一文了解Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn)
代理是指:某些場(chǎng)景下對(duì)象會(huì)找一個(gè)代理對(duì)象,來輔助自己完成一些工作,如明星的經(jīng)紀(jì)人、買房的人找房產(chǎn)中介等。
代理主要是對(duì)對(duì)象的行為額外做一些輔助操作。
如何創(chuàng)建代理對(duì)象:
Java中代理的代表類是:Java.lang.reflect.Proxy
Proxy提供了一個(gè)靜態(tài)方法,用于為對(duì)象產(chǎn)生一個(gè)代理對(duì)象返回
主類:
public class Test { public static void main(String[] args) { //1、創(chuàng)建一個(gè)類,對(duì)象類必須實(shí)現(xiàn)接口 star s=new star("小明"); //為小明這個(gè)明星對(duì)象生成一個(gè)代理對(duì)象(經(jīng)紀(jì)人) skill s2=StarAgentProxy.getProxy(s); s2.sing();//走代理的 s2.jump(); //運(yùn)行結(jié)果: //代理開始 //小明開始唱歌 //代理結(jié)束 //代理開始 //小明開始跳舞 //代理結(jié)束 } }
明星類(對(duì)象類):
//明星類 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 { //定義一個(gè)方法來返回一個(gè)明星對(duì)象的代理對(duì)象 public static skill getProxy(star obj){ //為小明這個(gè)對(duì)象生成一個(gè)代理對(duì)象 /* public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, 對(duì)象實(shí)現(xiàn)的接口列表 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==>正在調(diào)用的方法對(duì)象, args==>代表這個(gè)方法的參數(shù) Object rs=method.invoke(obj,args); System.out.println("代理結(jié)束"); return rs; } }); } }
實(shí)現(xiàn)步驟:
1、必須存在接口
2、被代理的對(duì)象需要實(shí)現(xiàn)接口
3、使用Proxy類提供的方法得到對(duì)象的代理對(duì)象
通過代理對(duì)象調(diào)用方法,執(zhí)行流程是什么樣的?
1、先走向代理
2、代理可以為方法額外做一些輔助工作
3、開始真正觸發(fā)對(duì)象的方法的執(zhí)行
4、回到代理中,由代理負(fù)責(zé)返回結(jié)果給方法的調(diào)用者
優(yōu)化代碼的關(guān)鍵步驟:
1、必須有接口,實(shí)現(xiàn)類要實(shí)現(xiàn)接口(代理通常是基于接口實(shí)現(xiàn)的)
2、創(chuàng)建一個(gè)實(shí)現(xiàn)類的對(duì)象,該對(duì)象為業(yè)務(wù)對(duì)象,緊接著為業(yè)務(wù)對(duì)象做一個(gè)代理對(duì)象
動(dòng)態(tài)代理的優(yōu)點(diǎn):
1、可以在不改變方法源碼的情況下,實(shí)現(xiàn)對(duì)方法功能的增強(qiáng),提高了代碼的復(fù)用
2、簡化了編程工作、提高了開發(fā)效率,同時(shí)提高了軟件系統(tǒng)的可拓展性
3、可以為被代理對(duì)象的所有方法做代理
4、非常靈活,支持任意接口類型的實(shí)現(xiàn)類對(duì)象做代理,也可以直接為接口本身做代理
為任意接口類型的實(shí)現(xiàn)類對(duì)象做代理的框架(運(yùn)行泛型)
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; } }); }
到此這篇關(guān)于一文了解Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java實(shí)現(xiàn)JDK動(dòng)態(tài)代理的原理詳解
- Java cglib動(dòng)態(tài)代理原理分析
- Java JDK動(dòng)態(tài)代理實(shí)現(xiàn)原理實(shí)例解析
- Java動(dòng)態(tài)代理語法Proxy類原理詳解
- Java 動(dòng)態(tài)代理原理分析
- Java JDK動(dòng)態(tài)代理(AOP)的實(shí)現(xiàn)原理與使用詳析
- JAVA動(dòng)態(tài)代理模式(從現(xiàn)實(shí)生活角度理解代碼原理)
- Java JDK動(dòng)態(tài)代理的基本原理詳細(xì)介紹
- Java動(dòng)態(tài)代理簡單介紹
相關(guān)文章
Springboot 整合 Dubbo/ZooKeeper 實(shí)現(xiàn) SOA 案例解析
這篇文章主要介紹了Springboot 整合 Dubbo/ZooKeeper 詳解 SOA 案例,需要的朋友可以參考下2017-11-11IDEA連接MySQL提示serverTimezone的問題及解決方法
很多朋友私聊小編,使用IDEA軟件連接MySQL數(shù)據(jù)庫時(shí)總是提示Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.的錯(cuò)誤,小編就不一一回復(fù)大家了,下面小編把我的解決方法分享到腳本之家平臺(tái),需要的朋友參考下吧2021-05-05java8新特性之stream流中reduce()求和知識(shí)總結(jié)
今天帶大家回顧Java8的新特性,文中對(duì)stream流中reduce()求和的相關(guān)知識(shí)作了詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05java&javascript自定義加密數(shù)據(jù)傳輸代碼示例
這篇文章主要介紹了java&javascript自定義加密數(shù)據(jù)傳輸代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11淺談Java8 的foreach跳出循環(huán)break/return
這篇文章主要介紹了Java8 的foreach跳出循環(huán)break/return,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07一文帶你深入了解Java中延時(shí)任務(wù)的實(shí)現(xiàn)
延時(shí)任務(wù)相信大家都不陌生,在現(xiàn)實(shí)的業(yè)務(wù)中應(yīng)用場(chǎng)景可以說是比比皆是。這篇文章主要為大家介紹幾種實(shí)現(xiàn)延時(shí)任務(wù)的辦法,感興趣的可以了解一下2022-11-11