Java的動態(tài)代理模式之JDK代理詳解
更新時間:2023年11月28日 08:44:06 作者:四葉草
這篇文章主要介紹了Java的動態(tài)代理模式之JDK代理詳解,代理對象,不需要實(shí)現(xiàn)接口,但是目標(biāo)對象要實(shí)現(xiàn)接口,否則不能用動態(tài)代理,JDK?實(shí)現(xiàn)代理只需要使用?newProxyInstance?方法,但是該方法需要接收三個參數(shù),需要的朋友可以參考下
1.動態(tài)代理模式的基本介紹
- 代理對象,不需要實(shí)現(xiàn)接口,但是目標(biāo)對象要實(shí)現(xiàn)接口,否則不能用動態(tài)代理
- 代理對象的生成,是利用 JDK 的 API,動態(tài)的在內(nèi)存中構(gòu)建代理對象
- 動態(tài)代理也叫做:JDK 代理、接口代理
2. JDK 中生成代理對象的 API
- 代理類所在包:java.lang.reflect.Proxy
- JDK 實(shí)現(xiàn)代理只需要使用 newProxyInstance 方法,但是該方法需要接收三個參數(shù),完整的寫法是:static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
3.動態(tài)代理應(yīng)用實(shí)例
3.1具體要求
- 定義一個接口:ITeacherDao
- 目標(biāo)對象 TeacherDAO 實(shí)現(xiàn)接口 ITeacherDAO
- JDK代理模式,實(shí)現(xiàn)動態(tài)代理
3.2代碼實(shí)現(xiàn)
package com.atguigu.proxy.dynamic;
public class Client {
public static void main(String[] args) {
//創(chuàng)建目標(biāo)對象
ITeacherDao target = new TeacherDao();
//給目標(biāo)對象,創(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)用目標(biā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 {
//維護(hù)一個目標(biāo)對象 , Object
private Object target;
//構(gòu)造器 , 對 target 進(jìn)行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//給目標(biāo)對象 生成一個代理對象
public Object getProxyInstance() {
//說明
/*
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
//1. ClassLoader loader : 指定當(dāng)前目標(biāo)對象使用的類加載器, 獲取加載器的方法固定
//2. Class<?>[] interfaces: 目標(biāo)對象實(shí)現(xiàn)的接口類型,使用泛型方法確認(rèn)類型
//3. InvocationHandler h : 事情處理,執(zhí)行目標(biāo)對象的方法時,會觸發(fā)事情處理器方法, 會把當(dāng)前執(zhí)行的目標(biāo)對象方法作為參數(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 代理開始~~");
//反射機(jī)制調(diào)用目標(biā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)代理提高代碼可維護(hù)性和復(fù)用性利器
- Spring之AOP兩種代理機(jī)制對比分析(JDK和CGLib動態(tài)代理)
- Java JDK與cglib動態(tài)代理有什么區(qū)別
- 解讀jdk動態(tài)代理為什么必須實(shí)現(xiàn)接口
- Java實(shí)現(xiàn)JDK動態(tài)代理的原理詳解
- Java反射(JDK)與動態(tài)代理(CGLIB)詳解
- Java JDK動態(tài)代理在攔截器和聲明式接口中的應(yīng)用小結(jié)
相關(guān)文章
java實(shí)現(xiàn)驗(yàn)證碼類生成中文驗(yàn)證碼
java實(shí)現(xiàn)的漢字輸入驗(yàn)證碼,主要包含兩個類,一個是生成驗(yàn)證碼,一個是判斷驗(yàn)證碼輸入是否正確,實(shí)現(xiàn)原理非常簡單,將漢字和干擾線生成圖片并將漢字保存到session,前臺獲取每次生成驗(yàn)證碼圖片并用文本框值和session值比較,功能就怎么簡單2014-01-01
mybatis中string和date的轉(zhuǎn)換方式
這篇文章主要介紹了mybatis中string和date的轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring Cloud Hystrix線程池不足的解決方法
這篇文章主要介紹了Spring Cloud Hystrix線程池不足的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
intellij idea創(chuàng)建第一個動態(tài)web項(xiàng)目的步驟方法
這篇文章主要介紹了intellij idea創(chuàng)建第一個動態(tài)web項(xiàng)目的步驟方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Springboot全局異常捕獲及try catch區(qū)別解析
這篇文章主要介紹了Springboot全局異常捕獲及try catch區(qū)別解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06
使用SpringCache操作Redis緩存數(shù)據(jù)的示例代碼
SpringCache是一個框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡單的加一個注解,就能實(shí)現(xiàn)緩存功能,本文給大家介紹了如何使用SpringCache操作Redis緩存數(shù)據(jù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01

