Java的動態(tài)代理模式之JDK代理詳解
更新時間:2023年11月28日 08:44:06 作者:四葉草
這篇文章主要介紹了Java的動態(tài)代理模式之JDK代理詳解,代理對象,不需要實現(xiàn)接口,但是目標對象要實現(xiàn)接口,否則不能用動態(tài)代理,JDK?實現(xiàn)代理只需要使用?newProxyInstance?方法,但是該方法需要接收三個參數(shù),需要的朋友可以參考下
1.動態(tài)代理模式的基本介紹
- 代理對象,不需要實現(xiàn)接口,但是目標對象要實現(xiàn)接口,否則不能用動態(tài)代理
- 代理對象的生成,是利用 JDK 的 API,動態(tài)的在內(nèi)存中構(gòu)建代理對象
- 動態(tài)代理也叫做:JDK 代理、接口代理
2. JDK 中生成代理對象的 API
- 代理類所在包:java.lang.reflect.Proxy
- JDK 實現(xiàn)代理只需要使用 newProxyInstance 方法,但是該方法需要接收三個參數(shù),完整的寫法是:static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
3.動態(tài)代理應(yīng)用實例
3.1具體要求
- 定義一個接口:ITeacherDao
- 目標對象 TeacherDAO 實現(xiàn)接口 ITeacherDAO
- JDK代理模式,實現(xiàn)動態(tài)代理
3.2代碼實現(xiàn)
package com.atguigu.proxy.dynamic; public class Client { public static void main(String[] args) { //創(chuàng)建目標對象 ITeacherDao target = new TeacherDao(); //給目標對象,創(chuàng)建代理對象, 可以轉(zhuǎn)成 ITeacherDao ITeacherDao proxyInstance = (ITeacherDao)newProxyFactory(target).getProxyInstance(); // proxyInstance=class com.sun.proxy.$Proxy0 內(nèi)存中動態(tài)生成了代理對象 System.out.println("proxyInstance=" + proxyInstance.getClass()); //通過代理對象,調(diào)用目標對象的方法 //proxyInstance.teach(); proxyInstance.sayHello(" tom "); } }
//接口 public interface ITeacherDao { void teach(); // 授課方法 void sayHello(String name); }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class ProxyFactory { //維護一個目標對象 , Object private Object target; //構(gòu)造器 , 對 target 進行初始化 public ProxyFactory(Object target) { this.target = target; } //給目標對象 生成一個代理對象 public Object getProxyInstance() { //說明 /* public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) //1. ClassLoader loader : 指定當前目標對象使用的類加載器, 獲取加載器的方法固定 //2. Class<?>[] interfaces: 目標對象實現(xiàn)的接口類型,使用泛型方法確認類型 //3. InvocationHandler h : 事情處理,執(zhí)行目標對象的方法時,會觸發(fā)事情處理器方法, 會把當前執(zhí)行的目標對象方法作為參數(shù)傳入 */ return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("JDK 代理開始~~"); //反射機制調(diào)用目標對象的方法 Object returnVal = method.invoke(target, args); System.out.println("JDK 代理提交"); return returnVal; } }); } }
public class TeacherDao implements ITeacherDao { @Override public void teach() { System.out.println(" 老師授課中.... "); } @Override public void sayHello(String name) { System.out.println("hello " + name); } }
到此這篇關(guān)于Java的動態(tài)代理模式之JDK代理詳解的文章就介紹到這了,更多相關(guān)JDK代理詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:
- 深入了解SpringAOP中的jdk動態(tài)代理與CGlib
- Java兩種動態(tài)代理JDK動態(tài)代理和CGLIB動態(tài)代理詳解
- JDK動態(tài)代理提高代碼可維護性和復(fù)用性利器
- Spring之AOP兩種代理機制對比分析(JDK和CGLib動態(tài)代理)
- Java JDK與cglib動態(tài)代理有什么區(qū)別
- 解讀jdk動態(tài)代理為什么必須實現(xiàn)接口
- Java實現(xiàn)JDK動態(tài)代理的原理詳解
- Java反射(JDK)與動態(tài)代理(CGLIB)詳解
- Java JDK動態(tài)代理在攔截器和聲明式接口中的應(yīng)用小結(jié)
相關(guān)文章
mybatis中string和date的轉(zhuǎn)換方式
這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Spring Cloud Hystrix線程池不足的解決方法
這篇文章主要介紹了Spring Cloud Hystrix線程池不足的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02intellij idea創(chuàng)建第一個動態(tài)web項目的步驟方法
這篇文章主要介紹了intellij idea創(chuàng)建第一個動態(tài)web項目的步驟方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Springboot全局異常捕獲及try catch區(qū)別解析
這篇文章主要介紹了Springboot全局異常捕獲及try catch區(qū)別解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06使用SpringCache操作Redis緩存數(shù)據(jù)的示例代碼
SpringCache是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單的加一個注解,就能實現(xiàn)緩存功能,本文給大家介紹了如何使用SpringCache操作Redis緩存數(shù)據(jù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01