代理分为动态代理和静态代理,在靜態代理的實現中,代理物件(付体)被代理的物件(主体)都必須實現同一個介面(接口),在代理物件中可以實現記錄等相關服務(与主体业务相关的其他逻辑),並在需要的時候再呼叫被代理的物件,如此被代理物件當中就可以僅保留業務相關職責。
      (1)、静态代理:代理物件与被代理物件相关联,主要是通过接口,在代理物件中定义一个接口,然后被代理物件继承该接口,之后作为一个参数传入代理物件中。
注意:建构代理物件时必须给他一个被代理物件,使代理物件和被代理物件相互绑定。
      (2)、动态代理:动态代理类必须实现InvocationHandler接口。
代码如下:

package onlyfun.caterpillar;

import java.util.logging.*;
import java.lang.reflect.*;

public class LogHandler implements InvocationHandler {
private Logger logger =
Logger.getLogger(this.getClass().getName());

private Object delegate;

public Object bind(Object delegate) {
this.delegate = delegate;
return Proxy.newProxyInstance(
delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(),
this);
}

public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
Object result = null;

try {
log("method starts..." + method);

result = method.invoke(delegate, args);

logger.log(Level.INFO, "method ends..." + method);
} catch (Exception e){
log(e.toString());
}

return result;
}

private void log(String message) {
logger.log(Level.INFO, message);
}
}
解说:public Object bind(object delegate)方法,用来接收一个被代理的类,该方法主要是用
来将代理类与被代理类绑定Proxy.newProxyInstance(delegate.getClass().getClassLoad
er(),delegate.getClass().getInterfaces(),this);第一个参数是被代理类,第二个参数是被
代理类实现的接口,第三个参数是代理类本身,该方法返回一个代理物件。建立代理物件時必須告知所要
代理的介面,之後您可以操作所建立的代理物件,在每次操作時會呼叫InvocationHandler的invoke()
方法,invoke()方法會傳入被代理物件的方法名稱與執行參數,實際上要執行的方法交由method.invok
e(),您在method.invoke()前後加上記錄動作,method.invoke()傳回的物件是實際方法執行過後
的回傳結果。


posted on 2007-05-18 14:58  王永庆  阅读(484)  评论(0编辑  收藏  举报