静态字段的范围是啥?
Posted
技术标签:
【中文标题】静态字段的范围是啥?【英文标题】:what's the scope of a static field?静态字段的范围是什么? 【发布时间】:2012-05-29 14:03:03 【问题描述】:我在静态领域遇到问题。我认为根本原因一定是静态字段的范围。
该项目基于 Apache servicemix,由多个子项目组成。
在子项目'A'中,我在'Registration'类中定义了一个静态列表字段'reg'和一些静态方法来操作'add'和'getAll'等字段。部署子项目A后,项目“A”的名称将被添加到静态列表中进行注册。
问题是当涉及到子项目“B”时,当部署子项目“B”时,我希望将其名称添加到完全相同的静态列表中进行注册。但是当我调用静态方法getAll或添加'Registration'时,似乎子projectB中的'reg'与子projectA中的'reg'完全不同。所以注册功能不起作用。
所以我想问一个基本问题,静态字段的范围是什么?它在 JVM 或其他一些东西中有效吗?
感谢您的帮助
【问题讨论】:
【参考方案1】:静态的作用域是全局的——在它所属的类加载器中。 JVM 可以创建多个类加载器并在每个新的类加载器中加载您的类的单独实例。
静态不是每个 JVM 的全局变量,它们是每个类加载器的全局变量。如果具有静态字段的类在不同的类加载器中加载,则其静态成员在不同的类加载器中将不可见。
项目 A 和项目 B 是如何部署的?他们在同一个类加载器中吗?
我不熟悉 servicemix,但我想它会在不同的类加载器中部署单独的应用程序,就像 Java EE 应用程序会在不同的类加载器中部署同一应用程序的不同版本一样,因此您可以在应用程序 1.0 和应用程序 1.1 端运行- 并排,它们不会相互影响。
这是设计使然。
如果是这种情况,您需要一些独立的东西来维护共享状态。 (例如数据库)
【讨论】:
以上是关于静态字段的范围是啥?的主要内容,如果未能解决你的问题,请参考以下文章