0

我似乎陷入了两难境地。保留我项目的复杂细节,我正在尝试执行以下操作。(为简单起见,排除和替换一些代码,如导入和 try-catch)

1  public class Client
2  {
3     private Registry reg1; 
4     private GameSessionInterface sesh1;
5  
6     public static void main(String[] args)
7     {
8        reg1 = LocateRegistry.getRegistry(serverIP, 4200);
9        sesh1 = (GameSessionInterface)reg1.lookup("Session1");
10    }
11 }

在第 8 行和第 9 行,我分别收到错误“无法对非静态字段 reg1 进行静态引用”“无法对非静态字段 sesh1 进行静态引用”

如果我在 main 中声明 reg1 和 sesh1,我不会遇到这个问题。但是我至少需要 sesh1 是全局的,这样我就可以让方法在 main 之外访问它。

我不是 100% 确定 RMI 变量在 JVM 中是如何工作的,所以我不确定将它们声明为静态是否安全。逻辑将遵循这一点,因为我不会在同一个 JVM 中创建多个Client实例,这应该没关系,但考虑到这是对远程对象的引用,我不知道这是否会有一些看不见的副作用。我已经搜索了一段时间,似乎没有人解决这个问题。但与此同时,我似乎无法找到这些静态声明的代码示例,这也引出了一个问题,当类似代码存在于其他地方并在全球范围内进行非静态声明时,为什么我不能按原样编译它。

我对 Java 中的 RMI 真的很陌生,所以如果你们中的任何一个有更多 RMI 经验的人可以阐明所有这些如何交互以及为什么我可能会收到这个错误,我将不胜感激。

提前致谢!

4

1 回答 1

0

RMI 变量与任何其他变量没有什么不同。例如,您可以在main().

但是,如果您使用 来创建注册表LocateRegistry.createRegistry(),则必须将其存储到静态变量中。否则它可能会被垃圾收集并消失。

当类似代码存在于其他地方并在全球范围内进行非静态声明时,为什么我不能按原样编译它的问题

不,它没有。再看一遍。静态变量和实例变量的规则在整个 Java 中是相同的。RMI 没有也不能改变这一点。

于 2016-11-27T01:02:39.687 回答