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

Java動態代理講解和示例

開發 前端
Java 動態代理底層原理是基于反射機制實現的,其中最重要的是 InvocationHandler 接口,它定義了一個 invoke() 方法,用于實現對代理類中各個方法的調用,在 invoke() 方法中,可以實現對真實角色的調用,并進行擴展,實現動態代理的效果。

Java動態代理是一種在運行時創建代理類的機制,動態代理可以在不修改源代碼的情況下,在運行時為某個接口動態生成實現類,并且可以攔截接口中的方法調用,從而實現一些特殊的功能。

Java 動態代理底層原理是基于反射機制實現的,其中最重要的是 InvocationHandler 接口,它定義了一個 invoke() 方法,用于實現對代理類中各個方法的調用,在 invoke() 方法中,可以實現對真實角色的調用,并進行擴展,實現動態代理的效果。

動態代理的實現步驟:

1. 創建一個實現 InvocationHandler 接口的類,它必須實現 invoke() 方法;

2. 創建被代理的真實對象;

3. 通過 Proxy 類的 newProxyInstance() 方法創建代理對象,它需要參數:

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

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

(3)InvocationHandler:它是調用處理器,執行代理對象的方法時,會觸發該對象的 invoke() 方法;

4. 通過代理對象調用目標方法,實際上會轉到 invoke() 方法中,在 invoke() 方法中,可以進行預處理、調用后處理等工作。

反射上一篇文章講過了,這里就是反射的一個應用,這個最常見的場景就是給代碼加日志,例如在執行某個函數前將請求體加入到日志中,執行后將結果加入到日志中。這樣可以在不改變原來代碼的基礎上來實現。接下來就使用上一篇反射的例子繼續擴展。

先寫一個Person的接口:

package ReflectTest;

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

寫他的實現:

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);
}
}

然后寫動態代理類:

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("執行函數前加入日志");
Object result = method.invoke(target, args);
System.out.println("執行函數后加入日志");
return result;
}
}

最后測試一下:

package ReflectTest;

public class main {

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

}

我們看看結果在執行函數前后執行了其他操作:

SpringAOP其實原理就類似這種。

責任編輯:姜華 來源: 今日頭條
相關推薦

2011-11-17 14:32:45

Java靜態代理動態代理

2023-12-06 08:23:44

代理模式設計模式

2021-07-06 06:39:22

Java靜態代理動態代理

2023-11-26 00:13:16

開源數據Logstash

2011-04-06 11:41:25

Java動態代理

2022-06-27 10:26:37

枚舉Java

2012-08-28 10:59:26

JavaJava動態代理Proxy

2017-10-12 14:56:11

2011-03-23 10:40:51

java代理模式

2015-09-22 11:09:47

Java 8動態代理

2017-05-11 21:30:01

Android動態代理ServiceHook

2009-12-28 15:45:22

動態網絡接入控制

2015-09-28 15:59:00

Java動態代理機制

2010-01-28 16:01:18

Android Jni

2015-09-24 08:55:14

Java動態代理擴展

2015-09-24 08:54:36

java動態代理

2018-04-16 10:12:46

Linux命令gunzip

2009-12-24 13:51:49

WPF文檔打印

2009-09-15 10:16:01

LINQ動態查詢

2010-04-21 09:26:54

Java動態代理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩午夜激情 | 国产一级在线 | 国产精品视频专区 | 亚洲视频在线观看免费 | 色av一区 | 伊人一二三| 国产美女永久免费无遮挡 | 亚洲一区二区 | 亚洲视频国产 | 91精品国产综合久久久动漫日韩 | 三级黄色大片网站 | 999久久久久久久久6666 | 亚洲日韩中文字幕一区 | 天天玩天天操天天干 | 人人做人人澡人人爽欧美 | 亚洲国产精品久久久 | 91久久国产综合久久 | 成人精品鲁一区一区二区 | 色综合色综合 | 自拍偷拍第一页 | 欧美一级免费片 | 97精品超碰一区二区三区 | 欧美啪啪| 国产成人精品综合 | 黄色在线免费观看 | 伊人av在线播放 | 欧美日韩国产一区二区 | 亚洲69p | 国产免费xxx | 欧美激情欧美激情在线五月 | 欧美区精品 | av看片网| 日韩中文字幕在线视频 | 国产精品婷婷 | 97超碰在线免费 | 久久天天躁狠狠躁夜夜躁2014 | 久久在线视频 | 久久国产香蕉 | 久久久久久亚洲精品 | 成人国产精品色哟哟 | 在线国产中文字幕 |