動態代理簡單實現
package cn.ys.utils;
/**
* @author 鄧聰 E-mail:[email protected]
* @version 創建時間:${date} ${time}
* 類說明 被代理類實現的接口
*/
public interface InterTargit {
public void function();
}
//=============================================================
package cn.ys.utils;
/**
* @author 鄧聰 E-mail:[email protected]
* @version 創建時間:${date} ${time}
* 類說明 被代理類,(如果沒有實現接口,但是接口方法有被代理類
* 特征簽名相同的方法,那麽也可以實現代理功能)
*/
public class Targit implements InterTargit{
public void function() {
System.out.println("Targit==========function");
}
}
//==============================================================
package cn.ys.utils;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author 鄧聰 E-mail:[email protected]
* @version 創建時間:${date} ${time}
* 類說明 代理類MyProxy
*/
public class MyProxy implements InvocationHandler{
private Object result;//目標方法返回結果
private Object tarObj;//需要代理的對象
public MyProxy(Object tarObj){//構造方法傳入代理對象
this.tarObj=tarObj;
}
//捕獲代理目標對象的方法,並在該方法執行前後增加額外方法
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("目標方法執行之前");
Method method1 = tarObj.getClass().getDeclaredMethod(method.getName(),
method.getParameterTypes());
result = method1.invoke(tarObj, args);
System.out.println("目標方法執行之後");
return result;
}
//主函數測試
public static void main(String[] args) {
//3個參數:系統類加載器,添加需要轉型的接口,實現InvocationHandler的代理對象
InterTargit targit=(InterTargit)Proxy.
newProxyInstance(ClassLoader.getSystemClassLoader()
,new Class[]{InterTargit.class}
,new MyProxy(new Targit()));
targit.function();
}
}
//打印結果:=====================================
目標方法執行之前
Targit==========function
目標方法執行之後
本文出自 “12155865” 博客,請務必保留此出處http://12165865.blog.51cto.com/12155865/1970052
動態代理簡單實現