java 中動態(tài)代理(JDK,cglib)實例代碼
更新時間:2017年04月24日 14:43:12 投稿:lqh
這篇文章主要介紹了java 中動態(tài)代理,這里介紹了JDK 動態(tài)代理與 cglib 動態(tài)代理的相關(guān)資料
java 動態(tài)代理實例詳解
1.jdk動態(tài)代理
/**
*
*/
package com.sinosoft;
/**
*接口:編寫一個委托類的接口,即靜態(tài)代理的(Apple接口)
*
*/
public interface Apple {
public void phoneCall();
}
/**
*
*/
package com.sinosoft;
/**
* 實現(xiàn)一個真正的委托類,即靜態(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)建一個動態(tài)代理類,實現(xiàn)InvocationHandler接口,并重寫該invoke方法
*
*/
public class DynamicProxy implements InvocationHandler{
private Object object;
public DynamicProxy(Object object) {
this.object=object;
}
/*
* proxy參數(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動態(tài)代理
*
*/
public class testDynamicProxy {
public static void main(String[] args) {
//1.創(chuàng)建接口的實現(xiàn)類
Apple tApple = new AppleImpl();
//2.動態(tài)代理類
DynamicProxy tDynamicProxy = new DynamicProxy(tApple);
ClassLoader tClassLoader = tApple.getClass().getClassLoader();
// 創(chuàng)建動態(tài)代理的對象,需要借助Proxy.newProxyInstance。該方法的三個參數(shù)分別是:
// ClassLoader loader表示當前使用到的appClassloader。
// Class<?>[] interfaces表示目標對象實現(xiàn)的一組接口。
// InvocationHandler h表示當前的InvocationHandler實現(xiàn)實例對象。
Apple apple = (Apple) Proxy.newProxyInstance(tClassLoader, new Class[] { Apple.class }, tDynamicProxy);
apple.phoneCall();
}
}
2.cglib動態(tài)代理
/**
*
*/
package com.sinosoft;
/**
* 實現(xiàn)一個真正的委托類,即靜態(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();
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
JVM性能調(diào)優(yōu)實現(xiàn)原理及配置
這篇文章主要介紹了JVM性能調(diào)優(yōu)實現(xiàn)原理及配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12
Mybatis(ParameterType)傳遞多個不同類型的參數(shù)方式
這篇文章主要介紹了Mybatis(ParameterType)傳遞多個不同類型的參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解
這篇文章主要介紹了Java 內(nèi)置Http Server構(gòu)建web應(yīng)用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09
Java AQS(AbstractQueuedSynchronizer)源碼解析
AbstractQueuedSynchronizer被稱為隊列同步器,簡稱為大家熟知的AQS,這個類可以稱作concurrent包的基礎(chǔ)。本文將通過剖析源碼來看看AQS是如何工作的,感興趣的可以了解一下2023-02-02
Java實戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng)
這篇文章主要介紹了Java實戰(zhàn)之吃貨聯(lián)盟訂餐系統(tǒng),文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
Java 并發(fā)編程ArrayBlockingQueue的實現(xiàn)
這篇文章主要介紹了Java 并發(fā)編程ArrayBlockingQueue的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02

