通過java反射調用遠程方法

來源:互聯網
上載者:User

整體通訊過程如:

 

package search;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.lang.reflect.Method;import java.net.ServerSocket;import java.net.Socket;import java.util.HashMap;import java.util.Map;public class SimpleServer {private Map remoteObjects=new HashMap();public void register(String className,Object remoteObject){remoteObjects.put(className, remoteObject);}public void service()throws Exception{ServerSocket serverSocket=new ServerSocket(8003);System.out.println("server has started");while(true){Socket socket=serverSocket.accept();InputStream in=socket.getInputStream();ObjectInputStream oin=new ObjectInputStream(in);Call call=(Call) oin.readObject();System.out.println(call);OutputStream out=socket.getOutputStream();ObjectOutputStream oout=new ObjectOutputStream(out);call=invoke(call);oout.writeObject(call);oin.close();oout.close();socket.close();}}private Call invoke(Call call){Object result;try{String className=call.getClassName();String methodName=call.getMethodName();Object[]params=call.getParams();Class classType=Class.forName(className);Class[]paramTypes=call.getParamTypes();Method method=classType.getMethod(methodName,paramTypes);Object remoteObject=remoteObjects.get(className);if(remoteObject==null){throw new Exception(className+"的遠程對象不存在");}else{result=method.invoke(remoteObject,params);}}catch(Exception e){result=e;}call.setResult(result);return call;}public static void main(String[]args) throws Exception{SimpleServer server=new SimpleServer();server.register("search.HelloService", new HelloServiceImpl());server.service();}}

 

package search;import java.util.Date;public class HelloServiceImpl implements HelloService{public String echo(String msg) {return "echo "+msg;}public Date getTime() {return new Date();}}

 

package search;import java.util.Date;public interface HelloService {public String echo(String msg);public Date getTime();}

 

package search;import java.io.Serializable;public class Call implements Serializable{private String className;//表示類名或介面名private String methodName;//表示方法名private Class[]paramTypes;//表示方法參數類型private Object[]params;//表示方法參數值//表示方法的執行結果private Object result;public Call(){}public Call(String className,String methodName,Class[]paramTypes,Object[]params){this.className=className;this.methodName=methodName;this.paramTypes=paramTypes;this.params=params;}public String getClassName(){return className;}public void setClassName(String className) {this.className = className;}public String getMethodName() {return methodName;}public void setMethodName(String methodName) {this.methodName = methodName;}public Class[] getParamTypes() {return paramTypes;}public void setParamTypes(Class[] paramTypes) {this.paramTypes = paramTypes;}public Object[] getParams() {return params;}public void setParams(Object[] params) {this.params = params;}public Object getResult() {return result;}public void setResult(Object result) {this.result = result;}public String toString(){return "classname= "+className+" methodname= "+methodName;}}

 

package search;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class SimpleClient {public void invoke(){try{Socket socket=new Socket("localhost",8003);InputStream in=socket.getInputStream();OutputStream out=socket.getOutputStream();ObjectOutputStream oout=new ObjectOutputStream(out);Call call=new Call("search.HelloService","echo",new Class[]{String.class},new Object[]{"hello"});System.out.println(call);oout.writeObject(call);ObjectInputStream oin=new ObjectInputStream(in);call=(Call)oin.readObject();System.out.println(call.getResult());oin.close();oout.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[]args){new SimpleClient().invoke();}}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.