我在静态领域遇到问题。我认为根本原因必须是静态字段的范围。
该项目基于Apache servicemix,由许多子项目组成。
在子项目'A'中,我在“注册”类中定义了一个静态列表字段'reg',以及一些静态方法来操作该字段,如'add'和'getAll'。部署子项目A后,项目“A”的名称将被添加到静态列表中进行注册。
问题是当涉及子项目'B'时,当子项目'B'被部署时,我希望它的名称将被添加到完全相同的静态列表中以进行注册。但是当我调用静态方法getAll或添加'注册'时,子项目B中的'reg'似乎与子项目A中的'reg'完全不同。因此注册功能不起作用。
所以我想问一个基本问题,静态字段的范围是什么?它在JVM或其他一些东西中是否有效?
感谢您的帮助
答案 0 :(得分:8)
静态的范围是全局的 - 在其拥有的类加载器中。 JVM可以创建多个类加载器,并在每个新的类加载器中加载类的单独实例。
每个JVM的静态不是全局的,它们是每个类加载器的全局。如果具有静态字段的类加载到不同的类加载器中,则其静态成员将不会在不同的类加载器中可见。
如何部署项目A和项目B?它们是否在同一个类加载器中?
我不熟悉servicemix,但我想它会在单独的类加载器中部署单独的应用程序,就像Java EE应用程序将在不同的类加载器中部署同一应用程序的不同版本一样,因此您可以运行app 1.0和app 1.1并排,他们不会相互影响。
这是设计的。
如果是这种情况,您需要一些独立的东西来维护共享状态。 (例如数据库)