在java中非法的远程方法
这是我第一次使用Java Rmi *。 我有一个扩展UnicastRemoteObject
的自定义类,实现了一个扩展远程的接口。 我认为我已经在类中正确地实现了接口的方法,但是当我尝试运行我的代码(并且它是关于一个没有参数的方法)时,我仍然得到IllegalArgumentException
。
jvm声称遇到了非法的远程方法,但方法和它的实现对我来说似乎很好。
除了错误地执行或调用方法之外,是否还有其他原因可能导致发生此exception?
这是堆栈跟踪:
SEVERE: null java.rmi.server.ExportException: remote object implements illegal remote interface; nested exception is: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract java.lang.String Node.getId() at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.exportObject(Unknown Source) at java.rmi.server.UnicastRemoteObject.<init>(Unknown Source) at java.rmi.server.UnicastRemoteObject.<init>(Unknown Source) at NodeImpl.<init>(NodeImpl.java:30) at NodeLauncher.main(NodeLauncher.java:11) Caused by: java.lang.IllegalArgumentException: illegal remote method encountered: public abstract java.lang.String Node.getId() at sun.rmi.server.Util.checkMethod(Unknown Source) at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source) at sun.rmi.server.Util.getRemoteInterfaces(Unknown Source) at sun.rmi.server.Util.createProxy(Unknown Source) ... 7 more
界面如下:
import java.rmi.*; import java.util.LinkedList; interface Node extends Remote { public boolean isAlive(); public LinkedList<NodeImpl> getLeafNodes(); public LinkedList<NodeImpl> getNeighborhoodList(); public String [] getRoutingTable(); public NodeImpl initiation(String credentials,Object application); public String route(String message,String key); public void inform(byte [] id); public String getId(); public boolean isConnected(); public void applicationClose(); public boolean distanceMeasure(); }
这里是这个类的构造函数:
public NodeImpl() throws RemoteException { super(); l=4; M=1; nodeId=new byte [16]; Random r=new Random(); r.nextBytes(nodeId); leafNodes=new LinkedList<NodeImpl>(); connected=false; ng=new NodeGUI(this); for(int i=0;i<l;i++) { leafNodes.add(null); } neighborhoodList=new LinkedList<NodeImpl>(); anyNodeWhoAnswered=new LinkedList<byte []>(); it=new InformingTimer(this); Thread informingTimerThread=new Thread(it); informingTimerThread.start(); try { Naming.rebind("rmi://" + "localhost" + ":1099/"+nodeId, this); } catch (Exception ex) { Logger.getLogger(NodeImpl.class.getName()).log(Level.SEVERE, null, ex); } bootstrap(); }
RMI Remote
接口上的所有方法都必须在throws
子句中声明RemoteException
,例如:
public String getId() throws RemoteException;
不清楚为什么exception名称是getId()
,这可能只是它检查的第一个方法。
此外, getLeafNodes()
和getNeighborhoodList()
方法应具有指定Node
返回types,而不是NodeImpl
,否则它们可能也会失败。