Java的動(dòng)態(tài)代理模式之JDK代理詳解
1.動(dòng)態(tài)代理模式的基本介紹
- 代理對(duì)象,不需要實(shí)現(xiàn)接口,但是目標(biāo)對(duì)象要實(shí)現(xiàn)接口,否則不能用動(dòng)態(tài)代理
- 代理對(duì)象的生成,是利用 JDK 的 API,動(dòng)態(tài)的在內(nèi)存中構(gòu)建代理對(duì)象
- 動(dòng)態(tài)代理也叫做:JDK 代理、接口代理
2. JDK 中生成代理對(duì)象的 API
- 代理類所在包:java.lang.reflect.Proxy
- JDK 實(shí)現(xiàn)代理只需要使用 newProxyInstance 方法,但是該方法需要接收三個(gè)參數(shù),完整的寫(xiě)法是:static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
3.動(dòng)態(tài)代理應(yīng)用實(shí)例
3.1具體要求
- 定義一個(gè)接口:ITeacherDao
- 目標(biāo)對(duì)象 TeacherDAO 實(shí)現(xiàn)接口 ITeacherDAO
- JDK代理模式,實(shí)現(xiàn)動(dòng)態(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)對(duì)象
ITeacherDao target = new TeacherDao();
//給目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象, 可以轉(zhuǎn)成 ITeacherDao
ITeacherDao proxyInstance = (ITeacherDao)newProxyFactory(target).getProxyInstance();
// proxyInstance=class com.sun.proxy.$Proxy0 內(nèi)存中動(dòng)態(tài)生成了代理對(duì)象
System.out.println("proxyInstance=" + proxyInstance.getClass());
//通過(guò)代理對(duì)象,調(diào)用目標(biāo)對(duì)象的方法
//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ù)一個(gè)目標(biāo)對(duì)象 , Object
private Object target;
//構(gòu)造器 , 對(duì) target 進(jìn)行初始化
public ProxyFactory(Object target) {
this.target = target;
}
//給目標(biāo)對(duì)象 生成一個(gè)代理對(duì)象
public Object getProxyInstance() {
//說(shuō)明
/*
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
//1. ClassLoader loader : 指定當(dāng)前目標(biāo)對(duì)象使用的類加載器, 獲取加載器的方法固定
//2. Class<?>[] interfaces: 目標(biāo)對(duì)象實(shí)現(xiàn)的接口類型,使用泛型方法確認(rèn)類型
//3. InvocationHandler h : 事情處理,執(zhí)行目標(biāo)對(duì)象的方法時(shí),會(huì)觸發(fā)事情處理器方法, 會(huì)把當(dāng)前執(zhí)行的目標(biāo)對(duì)象方法作為參數(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 代理開(kāi)始~~");
//反射機(jī)制調(diào)用目標(biāo)對(duì)象的方法
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的動(dòng)態(tài)代理模式之JDK代理詳解的文章就介紹到這了,更多相關(guān)JDK代理詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 深入了解SpringAOP中的jdk動(dòng)態(tài)代理與CGlib
- Java兩種動(dòng)態(tài)代理JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理詳解
- JDK動(dòng)態(tài)代理提高代碼可維護(hù)性和復(fù)用性利器
- Spring之AOP兩種代理機(jī)制對(duì)比分析(JDK和CGLib動(dòng)態(tài)代理)
- Java JDK與cglib動(dòng)態(tài)代理有什么區(qū)別
- 解讀jdk動(dòng)態(tài)代理為什么必須實(shí)現(xiàn)接口
- Java實(shí)現(xiàn)JDK動(dòng)態(tài)代理的原理詳解
- Java反射(JDK)與動(dòng)態(tài)代理(CGLIB)詳解
- Java JDK動(dòng)態(tài)代理在攔截器和聲明式接口中的應(yīng)用小結(jié)
相關(guān)文章
Java執(zhí)行Linux命令簡(jiǎn)單代碼舉例
這篇文章主要給大家介紹了關(guān)于Java執(zhí)行Linux命令的相關(guān)資料,在開(kāi)發(fā)的過(guò)程中要善于利用JAVA面向?qū)ο缶幊痰膬?yōu)勢(shì),與Linux/Unix命令或Shell腳本的優(yōu)勢(shì),并將二者相結(jié)合,需要的朋友可以參考下2023-12-12
Java中Executor和Executors的區(qū)別小結(jié)
在Java并發(fā)編程中,Executor是一個(gè)核心接口,提供了任務(wù)執(zhí)行的抽象方法,而Executors是一個(gè)工具類,提供了創(chuàng)建各種線程池的工廠方法,Executor關(guān)注任務(wù)的執(zhí)行,而Executors關(guān)注如何創(chuàng)建適合的執(zhí)行器,感興趣的可以了解一下2024-10-10
java通過(guò)HTTP接收json詳細(xì)實(shí)例代碼
Java作為一門(mén)廣泛使用的編程語(yǔ)言,很多開(kāi)發(fā)人員會(huì)用它來(lái)進(jìn)行http請(qǐng)求,獲取json數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于java通過(guò)HTTP接收json的相關(guān)資料,需要的朋友可以參考下2023-11-11
java連接SQL Server數(shù)據(jù)庫(kù)的方法
這篇文章主要為大家詳細(xì)介紹了java連接SQL Server數(shù)據(jù)庫(kù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
IDEA打開(kāi)java項(xiàng)目后里面的java文件不能運(yùn)行解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA打開(kāi)java項(xiàng)目后里面的java文件不能運(yùn)行的解決辦法,有時(shí)候想運(yùn)行別人的項(xiàng)目,但是別人的項(xiàng)目并非IDEA項(xiàng)目(甚至只有源碼),當(dāng)我們打開(kāi)項(xiàng)目時(shí)候,并不能運(yùn)行,需要的朋友可以參考下2023-10-10
SpringBoot+MySQL實(shí)現(xiàn)讀寫(xiě)分離的多種具體方案
在高并發(fā)和大數(shù)據(jù)量的場(chǎng)景下,數(shù)據(jù)庫(kù)成為了系統(tǒng)的瓶頸。為了提高數(shù)據(jù)庫(kù)的處理能力和性能,讀寫(xiě)分離成為了一種常用的解決方案,本文將介紹在Spring?Boot項(xiàng)目中實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)讀寫(xiě)分離的多種具體方案,需要的朋友可以參考下2023-06-06
大數(shù)據(jù) java hive udf函數(shù)的示例代碼(手機(jī)號(hào)碼脫敏)
這篇文章主要介紹了大數(shù)據(jù) java hive udf函數(shù)(手機(jī)號(hào)碼脫敏),的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
詳解Mybatis 傳遞參數(shù)類型為L(zhǎng)ist的取值問(wèn)題
這篇文章主要介紹了詳解Mybatis 傳遞參數(shù)類型為L(zhǎng)ist的取值問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

