昨天給同事新增了一個重載方法的接口,通過hessian的方式調用,debug調試一直調用的是原來的接口,經過上網差查資料,如果讓hessian支持調用重載方法需要isOverloadEnabled()設爲false。
關於Hessian中同名方法調用的重載問題
接口中的方法簽名:
public void test(Long i);
public void test(String i);
獲取方法名:
if (! _factory.isOverloadEnabled())
mangleName = method.getName();
else
mangleName = mangleName(method);
發送http請求:
conn = sendRequest(mangleName, args);
//hessian自己的流輸出對象
AbstractHessianOutput out = _factory.getHessianOutput(os);
out.call(methodName, args);
out.flush();
//call方法,序列化參數
if (args != null) {
for (int i = 0; i < args.length; i++)
writeObject(args[i]);
}
當設置_factory.isOverloadEnabled()爲false的時候,會直接獲取方法名
如果設置爲true的時候,會去調用AbstractSkeleton.mangleName(method, false);
方法內做法是將方法名連接方法參數類型,來唯一確認一個方法答名
Class []params = method.getParameterTypes();
for (int i = 0; i < params.length; i++) {
sb.append('_');
sb.append(mangleClass(params[i], isFull));
}
HessianSkeleton的調用方法處理方式:
String methodName = in.readMethod();
Method method = getMethod(methodName);
是通過發送的請求字節來反序列話的。sendRequest(mangleName, args);也就是mangleName
HessianProxyFactory.setOverloadEnabled(true)
當你的方法有重載的話。應該選擇將isOverloadEnabled設置爲true。這樣的話就不會造成
方法調用錯誤的情況