日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java动态代理_Java动态代理

發(fā)布時(shí)間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java动态代理_Java动态代理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java動(dòng)態(tài)代理

代理是一種設(shè)計(jì)模式。 當(dāng)我們想添加或修改現(xiàn)有類的某些功能時(shí),我們創(chuàng)建并使用代理對(duì)象。 使用代理對(duì)象而不是原始對(duì)象。 通常,代理對(duì)象具有與原始對(duì)象相同的方法,并且在Java代理類中,通常會(huì)extend原始類。 代理具有原始對(duì)象的句柄,并可以在該對(duì)象上調(diào)用方法。

這樣,代理類可以以便捷的方式實(shí)現(xiàn)許多事情:

  • 在方法開始和停止時(shí)記錄
  • 對(duì)參數(shù)進(jìn)行額外檢查
  • 嘲笑原始類的行為
  • 實(shí)現(xiàn)對(duì)昂貴資源的懶惰訪問

無需修改該類的原始代碼。 (以上列表并不廣泛,僅是示例。)

在實(shí)際應(yīng)用中,代理類不會(huì)直接實(shí)現(xiàn)功能。 遵循單責(zé)任原則,代理類僅進(jìn)行代理,并且實(shí)際的行為修改在處理程序中實(shí)現(xiàn)。 當(dāng)調(diào)用代理對(duì)象而不是原始對(duì)象時(shí),代理將決定是否必須調(diào)用原始方法或某些處理程序。 處理程序可以執(zhí)行其任務(wù),也可以調(diào)用原始方法。

即使代理模式不僅適用于在運(yùn)行時(shí)創(chuàng)建代理對(duì)象和代理Cass的情況,但這在Java中也是一個(gè)特別有趣的話題。 在本文中,我將重點(diǎn)介紹這些代理。

這是一個(gè)高級(jí)主題,因?yàn)樗枰褂梅瓷漕?#xff0c;或者字節(jié)代碼操作或編譯動(dòng)態(tài)生成的Java代碼。 或所有這些。 要使新類在運(yùn)行時(shí)還不能用作字節(jié)碼,將需要生成字節(jié)碼,并需要一個(gè)用于加載字節(jié)碼的類加載器。 要?jiǎng)?chuàng)建字節(jié)碼,可以使用cglib或bytebuddy或內(nèi)置的Java編譯器。

當(dāng)我們考慮代理類及其調(diào)用的處理程序時(shí),我們可以理解為什么在這種情況下責(zé)任分離很重要。 代理類是在運(yùn)行時(shí)生成的,但是可以將代理類調(diào)用的處理程序編碼為常規(guī)源代碼,并沿著整個(gè)程序的代碼進(jìn)行編譯(編譯時(shí))。

最簡單的方法是使用java.lang.reflect.Proxy類,它是JDK的一部分。 該類可以創(chuàng)建一個(gè)代理類或直接創(chuàng)建它的一個(gè)實(shí)例。 Java內(nèi)置代理的使用很容易。 您需要做的就是實(shí)現(xiàn)一個(gè)java.lang.InvocationHandler以便代理對(duì)象可以調(diào)用它。 InvocationHandler接口非常簡單。 它僅包含一個(gè)方法: invoke() 。 invoke() ,參數(shù)包含被代理的原始對(duì)象,被調(diào)用的方法(作為反射Method對(duì)象)和原始參數(shù)的對(duì)象數(shù)組。 示例代碼演示了用法:

package proxy;import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class JdkProxyDemo {interface If {void originalMethod(String s);}static class Original implements If {public void originalMethod(String s) {System.out.println(s);}}static class Handler implements InvocationHandler {private final If original;public Handler(If original) {this.original = original;}public Object invoke(Object proxy, Method method, Object[] args)throws IllegalAccessException, IllegalArgumentException,InvocationTargetException {System.out.println("BEFORE");method.invoke(original, args);System.out.println("AFTER");return null;}}public static void main(String[] args){Original original = new Original();Handler handler = new Handler(original);If f = (If) Proxy.newProxyInstance(If.class.getClassLoader(),new Class[] { If.class },handler);f.originalMethod("Hallo");}}

如果處理程序想要在原始對(duì)象上調(diào)用原始方法,則它必須有權(quán)訪問它。 Java代理實(shí)現(xiàn)未提供此功能。 您必須自己在代碼中將此參數(shù)傳遞給處理程序?qū)嵗?(請(qǐng)注意,有一個(gè)通常稱為proxy的對(duì)象作為參數(shù)傳遞給調(diào)用處理程序。這是Java反射動(dòng)態(tài)生成的代理對(duì)象,而不是我們要代理的對(duì)象。)這樣,您絕對(duì)可以使用單獨(dú)的對(duì)象每個(gè)原始類的處理程序?qū)ο?#xff0c;或者使用某種共享對(duì)象,這些共享對(duì)象恰好知道某種方式(如果有任何要調(diào)用的方法)來調(diào)用哪個(gè)原始對(duì)象。

作為一種特殊情況,您可以創(chuàng)建一個(gè)調(diào)用處理程序和一個(gè)沒有任何原始對(duì)象的接口的代理。 甚至不需要任何類來實(shí)現(xiàn)源代碼中的接口。 動(dòng)態(tài)創(chuàng)建的代理類將實(shí)現(xiàn)該接口。

如果要代理的類未實(shí)現(xiàn)接口,該怎么辦? 在這種情況下,您必須使用其他代理實(shí)現(xiàn)。 我們將在下周討論一下。

翻譯自: https://www.javacodegeeks.com/2016/01/java-dynamic-proxy.html

java動(dòng)態(tài)代理

總結(jié)

以上是生活随笔為你收集整理的java动态代理_Java动态代理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。