java 中動(dòng)態(tài)代理(JDK,cglib)實(shí)例代碼
java 動(dòng)態(tài)代理實(shí)例詳解
1.jdk動(dòng)態(tài)代理
/**
*
*/
package com.sinosoft;
/**
*接口:編寫(xiě)一個(gè)委托類的接口,即靜態(tài)代理的(Apple接口)
*
*/
public interface Apple {
public void phoneCall();
}
/**
*
*/
package com.sinosoft;
/**
* 實(shí)現(xiàn)一個(gè)真正的委托類,即靜態(tài)代理的(AppleImpl類)
*
*/
public class AppleImpl implements Apple {
/*
* 打電話
*/
@Override
public void phoneCall() {
System.out.println("打電話");
}
}
/**
*
*/
package com.sinosoft;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 創(chuàng)建一個(gè)動(dòng)態(tài)代理類,實(shí)現(xiàn)InvocationHandler接口,并重寫(xiě)該invoke方法
*
*/
public class DynamicProxy implements InvocationHandler{
private Object object;
public DynamicProxy(Object object) {
this.object=object;
}
/*
* proxy參數(shù)傳遞的即是代理類的實(shí)例。method是調(diào)用的方法,即需要執(zhí)行的方法;args是方法的參數(shù);
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(object, args);
return result;
}
}
/**
*
*/
package com.sinosoft;
import java.lang.reflect.Proxy;
/**
* @author jdk動(dòng)態(tài)代理
*
*/
public class testDynamicProxy {
public static void main(String[] args) {
//1.創(chuàng)建接口的實(shí)現(xiàn)類
Apple tApple = new AppleImpl();
//2.動(dòng)態(tài)代理類
DynamicProxy tDynamicProxy = new DynamicProxy(tApple);
ClassLoader tClassLoader = tApple.getClass().getClassLoader();
// 創(chuàng)建動(dòng)態(tài)代理的對(duì)象,需要借助Proxy.newProxyInstance。該方法的三個(gè)參數(shù)分別是:
// ClassLoader loader表示當(dāng)前使用到的appClassloader。
// Class<?>[] interfaces表示目標(biāo)對(duì)象實(shí)現(xiàn)的一組接口。
// InvocationHandler h表示當(dāng)前的InvocationHandler實(shí)現(xiàn)實(shí)例對(duì)象。
Apple apple = (Apple) Proxy.newProxyInstance(tClassLoader, new Class[] { Apple.class }, tDynamicProxy);
apple.phoneCall();
}
}
2.cglib動(dòng)態(tài)代理
/**
*
*/
package com.sinosoft;
/**
* 實(shí)現(xiàn)一個(gè)真正的委托類,即靜態(tài)代理的(AppleImpl類)
*
*/
public class AppleClass{
/*
* 打電話
*/
public void phoneCall() {
System.out.println("打電話");
}
}
/**
*
*/
package com.sinosoft;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @author Administrator
*
*/
public class CglibProxy implements MethodInterceptor{
/*
* 方法功能描述
* @param obj
* @param method
* @param args
* @param proxy
* @return
* @throws Throwable
* @see net.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object, java.lang.reflect.Method, java.lang.Object[], net.sf.cglib.proxy.MethodProxy)
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// TODO Auto-generated method stub
Object object= proxy.invokeSuper(obj, args);
return object;
}
}
/**
*
*/
package com.sinosoft;
import net.sf.cglib.proxy.Enhancer;
/**
* @author Administrator
*
*/
public class TestCglibProxy {
public static void main(String[] args) {
CglibProxy tCglibProxy=new CglibProxy();
Enhancer tEnhancer=new Enhancer();
tEnhancer.setSuperclass(AppleClass.class);
tEnhancer.setCallback(tCglibProxy);
AppleClass tApple= (AppleClass)tEnhancer.create();
tApple.phoneCall();
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
java中對(duì)字符串每個(gè)字符統(tǒng)計(jì)的方法
java中對(duì)字符串每個(gè)字符統(tǒng)計(jì)的方法,需要的朋友可以參考一下2013-03-03
JVM性能調(diào)優(yōu)實(shí)現(xiàn)原理及配置
這篇文章主要介紹了JVM性能調(diào)優(yōu)實(shí)現(xiàn)原理及配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
Mybatis(ParameterType)傳遞多個(gè)不同類型的參數(shù)方式
這篇文章主要介紹了Mybatis(ParameterType)傳遞多個(gè)不同類型的參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解
這篇文章主要介紹了Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
Java AQS(AbstractQueuedSynchronizer)源碼解析
AbstractQueuedSynchronizer被稱為隊(duì)列同步器,簡(jiǎn)稱為大家熟知的AQS,這個(gè)類可以稱作concurrent包的基礎(chǔ)。本文將通過(guò)剖析源碼來(lái)看看AQS是如何工作的,感興趣的可以了解一下2023-02-02
Java實(shí)戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng)
這篇文章主要介紹了Java實(shí)戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
Java 并發(fā)編程ArrayBlockingQueue的實(shí)現(xiàn)
這篇文章主要介紹了Java 并發(fā)編程ArrayBlockingQueue的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
如何用java對(duì)接微信小程序下單后的發(fā)貨接口
這篇文章主要介紹了在微信小程序后臺(tái)實(shí)現(xiàn)發(fā)貨通知的步驟,包括獲取Access_token、使用RestTemplate調(diào)用發(fā)貨接口、處理AccessToken緩存以及發(fā)貨成功后的提醒,需要的朋友可以參考下2025-03-03

