4

我在静态领域遇到问题。我认为根本原因必须是静态字段的范围。

该项目基于 Apache servicemix,由多个子项目组成。

在子项目'A'中,我在'Registration'类中定义了一个静态列表字段'reg'和一些静态方法来操作'add'和'getAll'等字段。部署子项目 A 后,项目“A”的名称将添加到静态列表中以进行注册。

问题是当涉及到子项目“B”时,当部署子项目“B”时,我希望将其名称添加到完全相同的静态列表中以进行注册。但是当我调用静态方法getAll或添加'Registration'时,似乎子projectB中的'reg'与子projectA中的'reg'完全不同。所以注册功能不起作用。

所以我想问一个基本问题,静态字段的范围是什么?它在JVM或其他一些东西中有效吗?

谢谢你的帮助

4

1 回答 1

9

静态的范围是全局的 - 在其拥有的类加载器内。JVM 可以创建多个类加载器并在每个新的类加载器中加载您的类的单独实例。

静态不是每个 JVM 的全局变量,它们是每个类加载器的全局变量。如果具有静态字段的类在不同的类加载器中加载,则其静态成员在不同的类加载器中将不可见。

项目A和项目B是如何部署的?他们在同一个类加载器中吗?

我不熟悉 servicemix,但我想它在单独的类加载器中部署单独的应用程序,就像 Java EE 应用程序将在不同的类加载器中部署同一应用程序的不同版本一样,因此您可以同时运行应用程序 1.0 和应用程序 1.1-侧,它们不会相互影响。

这是设计使然。

如果是这种情况,您需要一些独立的东西来维护共享状态。(例如数据库)

于 2012-05-23T03:18:40.687 回答