Java動態代理實現
Kongxx
在目前的Java開發包中包含了對動態代理的支持,但是其實現只支持對接口的的實現。
其實現主要通過是java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。
Proxy類主要用來獲取動態代理對象,InvocationHandler接口用來約束調用者實現,如下,HelloWorld接口定義的業務方法,HelloWorldImpl是HelloWorld接口的實現,HelloWorldHandler是InvocationHandler接口實現。代碼如下:
業務接口:
public interface HelloWorld { void sayHelloWorld() ; } |
業務接口實現:
public class HelloWorldImpl implements HelloWorld {
public void sayHelloWorld() { System.out.println("Hello World!"); } } |
InvocationHandler實現,需要在接口方法調用前后加入一部份處理工作,這里僅僅在方法調用前后向后臺輸出兩句字符串,其代碼如下:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class HelloWorldHandler implements InvocationHandler { //要代理的原始對象 private Object objOriginal; /** * 構造函數。 * @param obj 要代理的原始對象。 */ public HelloWorldHandler(Object obj) { this.objOriginal = obj ; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result ;
//方法調用之前 doBefore();
//調用原始對象的方法 result = method.invoke(this.objOriginal ,args);
//方法調用之后 doAfter();
return result ; }
private void doBefore() { System.out.println("before method invoke!"); }
private void doAfter() { System.out.println("after method invoke!"); } } |
測試代碼:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
HelloWorld hw = new HelloWorldImpl();
InvocationHandler handler = new HelloWorldHandler(hw);
HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance( hw.getClass().getClassLoader(), hw.getClass().getInterfaces(), handler);
proxy.sayHelloWorld(); } } |
Ø 首先獲取一個業務接口的實現對象;
Ø 獲取一個InvocationHandler實現,此處是HelloWorldHandler對象;
Ø 創建動態代理對象;
Ø 通過動態代理對象調用sayHelloWorld()方法,此時會在原始對象HelloWorldImpl. sayHelloWorld()方法前后輸出兩句字符串。
運行測試類輸出如下:
before method invoke! Hello World! after method invoke! |
此處Test類中的方法調用代碼比較多,在我們的實際應用中可以通過配置文件來來簡化客戶端的調用實現。另外也可以通過動態代理來實現簡單的AOP。
http://www.cnblogs.com/kongxx/archive/2005/08/08/209749.html