静态字段的范围是什么?

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

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

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

问题是当涉及子项目’B’时,当子项目’B’被部署时,我希望它的名称将被添加到完全相同的静态列表中进行注册。 但是当我调用静态方法getAll或添加“注册”时,子项目B中的’reg’似乎与子项目A中的’reg’完全不同。 因此注册function不起作用。

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

谢谢你的帮助

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

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

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

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

这是设计的。

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