“委託”在C#中是一個語言級特性,而在Java語言中沒有直接的對應,但是我們可以通過動態代理來實現委託!代碼如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*
* @author Liusheng
* 實現“委託”模式,用戶需要實現InvocationHandler接口;
*/
public Abstract class Delegator implements InvocationHandler {
//RelegateTo針對每個對象都要生成一個實例,因而非Static的log,代價比較高。
//Protected Log _log = LogFactory.getLog(this.getClass());
//private static Log _log = LogFactory.getLog(RelegateTo.class);
//--------------------------------------------
protected Object obj_orgin = null; //原始對象
protected Object obj_proxy = null; //代理對象
//--------------------------------------------
public Delegator() {
//空
}
public Delegator(Object orgin){
this.createProxy(orgin);
}
//--------------------------------------------
protected Object createProxy(Object orgin) {
obj_orgin = orgin;
obj_proxy = Proxy.newProxyInstance(
orgin.getClass().getClassLoader(), //載入器
orgin.getClass().getInterfaces(), //接口集
this); //委託
//_log.debug("# 委託代理:"+obj_proxy);
return obj_proxy;
}
protected Object invokeSuper(Method method, Object[] ARGs)
throws Throwable {
return method.invoke(obj_orgin, args);
}
//--------------實現InvocationHandler接口,要求覆蓋------------
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
// 預設實現:委託給obj_orgin完成對應的操作
if (method.getName().equals("toString")) { //對其做額外處理
return this.invokeSuper(method, args)+"$Proxy";
}else { //注意,調用原始對象的方法,而不是代理的(obj==obj_proxy)
return this.invokeSuper(method, args);
}
}
}
下面的代碼,則是作為一個委託的例子,實現Map的功能。
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Hashtable;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.bs2.core.UtilLog;
/**
* @author Liusheng
* 本代碼主要用於演示RelegateTo的使用方法
*/
public class Delegator4Map extends Delegator {
private static Log _log = LogFactory.getLog(Delegator4Map.class);
private Map orginClass = null; //原始對象
private Map proxyClass = null; //代理對象
public Map getOrgin() { return orginClass; }
public Map getProxy() { return proxyClass; }
public Delegator4Map(Map orgin) {
super(orgin);
orginClass = orgin;
proxyClass = (Map)super.obj_proxy;
}
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
if (method.getName().equals("size")) { //修改close處理邏輯
_log.debug("原始 size()="+super.invoke(obj, method, args));
Object res2 = new Integer(-1);
_log.debug("修改 size()="+res2);
return res2;
}else {
return super.invoke(obj, method, args);
}
}
public static void main(String[] args) throws IOException {
UtilLog.configureClassPath("resources/log4j.properties", false);
Delegator4Map rtm = new Delegator4Map(new Hashtable());
Map m = rtm.getProxy();
m.size();
_log.debug("代理:"+m.toString());
}
}
相關詞條
-
委託代理關係
委託代理關係是指市場交易中,由於信息不對稱,處於信息劣勢的委託方與處於信息優勢的代理方,相互博弈達成的契約法律關係。 按照詹森(Jensen)和威廉·麥...
定義 基本條件 發展 模式 法律特徵 -
委託貸款
委託貸款是指信託機構按委託人指定要求所發放的貸款。這種貸款的資金來源是特約信託存款,貸款的對象、數量和用途均由委託人決定,信託機構只負責辦理貸款的審查發...
申請條件 期限利率 業務流程 現金池 外部風險 -
設計模式
設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被...
簡介 設計框架 設計原則 基本模式 設計步驟 -
關於進一步加強村級會計委託代理服務工作的指導意見
附屬檔案:關於進一步加強村級會計委託代理服務工作的指導意見 關於進一步加強村級會計委託代理服務工作的指導意見 二、進一步加強對村級會計委託代理服務工作的指導
-
代理分銷渠道模式
代理分銷渠道模式是指製造商利用一定的中間商幫助尋找顧客、銷售商品,但是製造商沒有向中間商轉讓產品所有權。因此,中間商只是在接受生產商委託的前提下進行商品的代銷。
基本特徵 優缺點 -
委託訴訟代理人
根據民事訴訟法第58條的規定,我國的委託訴訟代理人包括律師、基層法律服務工作者;當事人的近親屬或者工作人員;當事人所在社區、單位以及有關社會團體推薦的公...
一、委託訴訟代理人的概念和特點 二、委託訴訟代理人的範圍 三、委託訴訟代理人的許可權 -
委託業務
委託業務是證券商接受客戶的委託,代理買賣有價證券,從中收取手續費的業務,亦稱“經紀人業務”,“自營業務” 的對稱。它的主要特點是: ①證券商買入或賣出有...
委託業務的類型 委託業務的特點分析 委託業務的時機選擇 信託業務與委託業務的區別 -
服務型模式
服務型政府是以公共事務的委託代理為特徵的。 這樣,在公共服務上,政府是委託人,部門是受託人,而政府預算就是代理費用。 因此,服務型政府行政模式並不排斥行...
服務型模式的概念 服務型政府行政模式的特點 服務型政府行政模式的優點 -
委託代理關係中的審計意見選擇行為研究
1.3.2研究的意義 1.5.2研究的結構 7.2.1研究結果
圖書信息 作者簡介 內容簡介 目錄