Remoting方法過載遇到的乙個問題

2021-09-05 20:04:23 字數 1765 閱讀 4355

在通過remoting呼叫過載的泛型方法時,遇到了乙個奇怪的問題,現使用乙個例子一步步來說明如下。

一.沒有過載的情況

假設remoting的介面是icomputer:

public

inte***ce

icomputer

在remoting server上的實現非常簡單:

public

class

computer : icomputer  }

然後,通過spring.net分別在配置server和client的remoting通道,接著client作如下呼叫:

icomputer remotecomupter 

=(icomputer)program.springcontext.getobject(

"remotingcomputer");

intres2 

=remotecomupter.add

<

gamerecorddetail

>

(new

gamerecorddetail());

這個呼叫是成功的,沒有任何問題,返回值為0。

二.新增乙個過載

我們為icomputer介面新增乙個過載方法,如下:

public

inte***ce

icomputer

服務端對過載方法的實現仍然是直接返回0。這時在client再次呼叫前面的方法,會丟擲system.nullreferenceexception。異常的堆疊位置是:      

&responsemsg, itransportheaders

&responseheaders, stream

&responsestream)

exception rethrown at [

0]: 

在 system.runtime.remoting.proxies.realproxy.handlereturnmessage(imessage reqmsg, imessage retmsg)

在 system.runtime.remoting.proxies.realproxy.privateinvoke(messagedata

&msgdata, int32 type)

在 remotinglib.icomputer.add[tentity](tentity c)

三.通過修改方法名消除過載

現將後面新增的方法重新命名為add2,client再次呼叫前面的方法,一切又恢復正常。

四.仍然使用過載,但去掉泛型引數

現在我們恢復過載,但將泛型引數去掉,如下所示:

public

inte***ce

icomputer

服務端對兩個方法的實現仍然是直接返回0。client再次呼叫前面的方法,一切是正常的。

五.測試的結果

根據上述的試驗,我們可以總結出,出現上述奇怪現象的條件有以下幾點:

1.通過remoting呼叫的目標方法必須是泛型的。

2.通過remoting呼叫的目標方法必須有過載。

如果滿足這兩個條件,那麼呼叫目標方法時就會丟擲上面的system.nullreferenceexception。那麼,為什麼會這樣了?答案探索中......

針對這個問題,目前我暫用的解決方案是,通過重新命名方法名以消除過載。 

方法的過載

1 方法的過載 方法的名稱和返回值型別都package cn.zcm993.method public class methoddemo02 public static int tell int i,int j public static int tell int i,int j,int k pub...

方法的過載

方法的名字相同但引數的型別或個數不同,我們叫做方法的過載。類允許有相同名字的方法,比如我們這個例子中的raisesalary方法。public void raisesalary double bypercent public void raisesalary int byabsolute 第乙個的引...

方法的過載

方法的過載 方法過載的規則 1.必須在同乙個類中 2.方法名必須一致 3.形參必須不同 1.形參型別不同 2.形參個數不同,兩種任意有乙個不同,都可以 4.修飾符和返回值跟方法過載無關,因為你呼叫方法的時候不會呼叫方法型別,只會用到方法名和引數。作用 可以使相同的方法名實現不同功能。方法過載的概念其...