1. 程式人生 > >動態代理簡單實現

動態代理簡單實現

動態代理簡單實現

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

動態代理簡單實現