成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java動(dòng)態(tài)代理講解和示例

開發(fā) 前端
Java 動(dòng)態(tài)代理底層原理是基于反射機(jī)制實(shí)現(xiàn)的,其中最重要的是 InvocationHandler 接口,它定義了一個(gè) invoke() 方法,用于實(shí)現(xiàn)對(duì)代理類中各個(gè)方法的調(diào)用,在 invoke() 方法中,可以實(shí)現(xiàn)對(duì)真實(shí)角色的調(diào)用,并進(jìn)行擴(kuò)展,實(shí)現(xiàn)動(dòng)態(tài)代理的效果。

Java動(dòng)態(tài)代理是一種在運(yùn)行時(shí)創(chuàng)建代理類的機(jī)制,動(dòng)態(tài)代理可以在不修改源代碼的情況下,在運(yùn)行時(shí)為某個(gè)接口動(dòng)態(tài)生成實(shí)現(xiàn)類,并且可以攔截接口中的方法調(diào)用,從而實(shí)現(xiàn)一些特殊的功能。

Java 動(dòng)態(tài)代理底層原理是基于反射機(jī)制實(shí)現(xiàn)的,其中最重要的是 InvocationHandler 接口,它定義了一個(gè) invoke() 方法,用于實(shí)現(xiàn)對(duì)代理類中各個(gè)方法的調(diào)用,在 invoke() 方法中,可以實(shí)現(xiàn)對(duì)真實(shí)角色的調(diào)用,并進(jìn)行擴(kuò)展,實(shí)現(xiàn)動(dòng)態(tài)代理的效果。

動(dòng)態(tài)代理的實(shí)現(xiàn)步驟:

1. 創(chuàng)建一個(gè)實(shí)現(xiàn) InvocationHandler 接口的類,它必須實(shí)現(xiàn) invoke() 方法;

2. 創(chuàng)建被代理的真實(shí)對(duì)象;

3. 通過 Proxy 類的 newProxyInstance() 方法創(chuàng)建代理對(duì)象,它需要參數(shù):

(1)ClassLoader:類加載器,它是用于加載代理對(duì)象字節(jié)碼的,和被代理對(duì)象使用相同的類加載器;

(2)Class[]:字節(jié)碼數(shù)組,它是用于讓代理對(duì)象和被代理對(duì)象有相同方法;

(3)InvocationHandler:它是調(diào)用處理器,執(zhí)行代理對(duì)象的方法時(shí),會(huì)觸發(fā)該對(duì)象的 invoke() 方法;

4. 通過代理對(duì)象調(diào)用目標(biāo)方法,實(shí)際上會(huì)轉(zhuǎn)到 invoke() 方法中,在 invoke() 方法中,可以進(jìn)行預(yù)處理、調(diào)用后處理等工作。

反射上一篇文章講過了,這里就是反射的一個(gè)應(yīng)用,這個(gè)最常見的場(chǎng)景就是給代碼加日志,例如在執(zhí)行某個(gè)函數(shù)前將請(qǐng)求體加入到日志中,執(zhí)行后將結(jié)果加入到日志中。這樣可以在不改變?cè)瓉泶a的基礎(chǔ)上來實(shí)現(xiàn)。接下來就使用上一篇反射的例子繼續(xù)擴(kuò)展。

先寫一個(gè)Person的接口:

package ReflectTest;

public interface PersonInterface {
void printName();
void printAge();
}

寫他的實(shí)現(xiàn):

package ReflectTest;

public class Person implements PersonInterface{
private String name = "xiaoming";
private String age = "12";

@Override
public void printName()
{
System.out.println(name);
}
@Override
public void printAge()
{
System.out.println(age);
}
}

然后寫動(dòng)態(tài)代理類:

package ReflectTest;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}

public Object bind() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("執(zhí)行函數(shù)前加入日志");
Object result = method.invoke(target, args);
System.out.println("執(zhí)行函數(shù)后加入日志");
return result;
}
}

最后測(cè)試一下:

package ReflectTest;

public class main {

public static void main(String[] args) {
ProxyHandler proxyHandler = new ProxyHandler(new Person());
PersonInterface person = (PersonInterface)proxyHandler.bind();
person.printName();
}

}

我們看看結(jié)果在執(zhí)行函數(shù)前后執(zhí)行了其他操作:

SpringAOP其實(shí)原理就類似這種。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2011-11-17 14:32:45

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

2023-12-06 08:23:44

代理模式設(shè)計(jì)模式

2021-07-06 06:39:22

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

2023-11-26 00:13:16

開源數(shù)據(jù)Logstash

2022-06-27 10:26:37

枚舉Java

2011-04-06 11:41:25

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

2012-08-28 10:59:26

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

2017-10-12 14:56:11

2011-03-23 10:40:51

java代理模式

2015-09-22 11:09:47

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

2009-12-28 15:45:22

動(dòng)態(tài)網(wǎng)絡(luò)接入控制

2015-09-28 15:59:00

Java動(dòng)態(tài)代理機(jī)制

2017-05-11 21:30:01

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

2010-01-28 16:01:18

Android Jni

2015-09-24 08:55:14

Java動(dòng)態(tài)代理擴(kuò)展

2015-09-24 08:54:36

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

2018-04-16 10:12:46

Linux命令gunzip

2009-12-24 13:51:49

WPF文檔打印

2009-09-15 10:16:01

LINQ動(dòng)態(tài)查詢

2024-02-19 16:23:11

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕中文字幕 | 日韩精品 电影一区 亚洲 | 久久免费观看视频 | av大片在线观看 | 精品一区二区三区免费毛片 | 成人久草 | 欧美啪啪网站 | 亚洲欧美另类在线观看 | 福利一区二区 | 青青久久久 | 欧美亚洲视频在线观看 | 欧美网址在线观看 | 亚洲一区二区在线播放 | 国产91精品久久久久久久网曝门 | 日韩欧美三级 | 久久天天躁狠狠躁夜夜躁2014 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 日韩三级电影一区二区 | 91视视频在线观看入口直接观看 | 亚洲一区国产精品 | 精品久久九九 | 小早川怜子xxxxaⅴ在线 | 国产精品久久国产精品99 | 亚洲免费视频一区二区 | www.99热| 日日操夜夜操天天操 | 91香蕉视频在线观看 | 国产视频在线观看一区二区三区 | 久久中文一区二区 | 日韩欧美三级电影 | 国产精品一码二码三码在线 | 亚洲综合一区二区三区 | 久草精品视频 | 成人伊人 | 日本特黄a级高清免费大片 国产精品久久性 | 久久国产精品一区二区三区 | 亚洲日韩视频 | 本道综合精品 | 91.xxx.高清在线 | 免费观看av | 国产精品夜间视频香蕉 |