System.setProperty and System.getProperty

34

当我使用 System.setProperty 来定义参数时,我不知道数据存储在哪里?

比如说,我在一个java文件中使用了 System.setProperty, 那么我可以在任何地方使用这个属性吗?但事实并非如此,我只能在调用 setProperty 的同一个java文件中使用它。

我真的不知道这个方法的作用和原因是什么。


2
它是每个JVM实例。 - Aniket Thakur
每个JVM实例?Aniket Thakur,你能告诉我更多吗? - Rocky Hu
2
为什么不阅读System class javadocs中的“getProperties”和“setProperties”,并尝试一下... - A4L
@DigengTianhan 提供了详细的答案。 - Aniket Thakur
4个回答

77

System类有一个名为props的static成员变量,它的类型是Properties。此外,PropertiesHashtable类的子类型。所有属性值都存储为键和值。因此,datastore是Hashtable。回答另一个问题,您可以在整个应用程序中使用System.getProperty(propertyKey)方法,因为它是一个公共静态方法。您没有理解java程序如何工作。当您运行Java程序时,实际上启动了一个JVM实例。该实例将具有自己的系统属性。这就是您必须放置属性的位置。当您运行其他程序时,该程序将具有自己的系统属性。因此,您不能指望在一个JVM实例中设置的属性可从另一个JVM实例访问!您可以在同一JVM实例中运行的所有类中访问System.getProperty(propertyKey)。希望您能理解!


希望能有一个“共享”或“持久化”的属性,以便在重新启动后再次获取它。 - Pwnstar
@Spektakulatius 我们可以有一个外部共享资源来存储这些属性,以便以后检索使用。这个共享资源可以是数据库、配置文件或任何其他达到相同目的的东西。 - Mandar Autade

3
如果您查看System类的源代码,它将具有以下类变量。
private static Properties props;

关于 properties 类,你可以把它看作是一个 HashMap。它实际上继承了 HashMap。

public class Properties extends Hashtable<Object,Object>

当您调用时

setProperty(String key, String value)

它实际上确实做到了

props.setProperty(key, value);

这只是一个总结(安全管理器检查也涉及其中)。

那么我为什么说它是每个JVM实例?

当您启动Java进程时,将创建一个单独的JVM实例来运行您的进程。此外,由于props是类变量(而不是实例变量),因此在相应的Class实例中只会存在一个副本,该副本将在加载该类时设置。现在,在假设您没有任何自定义类加载器的情况下,简化的场景下,您可以通过System.setProperty()System.getProperty()设置系统属性,以便您可以通过作为该Java进程(JVM)的一部分运行的任何类访问它们。


1
在第一个场景中,当A.java运行时,JVM将停止并释放所有值。当B.java运行时,JVM将重新启动。因此,该值不会持续存在。
在第二个场景中,JVM在执行之间不会停止。因此,属性值将从第二个程序中持续存在。

0

只要您的JVM实例在运行,数据就会存储在内存中。这与调用方法的文件无关。

您是如何运行应用程序的?它是存储在应用程序服务器中的Web应用程序吗? 您能发布一下您代码的示例吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接