Java System.setProperty和System.getProperty

Java System.setProperty和System.getProperty,java,Java,当我使用System.setProperty定义参数时,我不明白数据存储在哪里 如果说我在一个java文件中使用了System.setProperty,那么我可以在任何地方使用这些属性吗?但事实并非如此,我不能在任何地方使用它,只能在我称为setProperty的同一个java文件中使用它 我真的不知道为什么以及这个方法的功能是什么。只要JVM实例启动,数据就会存储在内存中。它实际上与调用方法的文件无关 你是如何运行你的应用程序的?它是存储在应用服务器中的web应用程序吗? 您可以发布代码示例吗

当我使用
System.setProperty
定义参数时,我不明白数据存储在哪里

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


我真的不知道为什么以及这个方法的功能是什么。

只要JVM实例启动,数据就会存储在内存中。它实际上与调用方法的文件无关

你是如何运行你的应用程序的?它是存储在应用服务器中的web应用程序吗?
您可以发布代码示例吗?

系统
类有一个名为props的
静态
成员变量,其类型为
属性
。除此之外,
Properties
Hashtable
类的一个子类型。所有属性值都存储为键和值。因此,
数据存储是哈希表
。回答另一个问题,您可以在整个应用程序中很好地使用
System.getProperty(propertyKey)
方法,因为它是一个公共静态方法。您还不了解java程序是如何工作的运行Java程序时,实际上是在启动JVM实例。该实例将具有自己的系统属性。那是你必须把你的财产放在那里的地方。当您运行另一个程序时,它将具有自己的系统属性。因此,您不能期望在一个JVM实例中设置的属性可以从另一个JVM实例访问!您可以在同一JVM实例中运行的所有类中访问
System.getProperty(propertyKey)
。希望你能理解

若您看到系统类的源代码,它有以下类变量

private static Properties props;
至于属性类,您可以将其视为HashMap。它实际上扩展了HashMap

public class Properties extends Hashtable<Object,Object>
确实如此

props.setProperty(key, value);
这只是总结(还涉及安全管理器检查)

现在为什么我说它是每个JVM实例的


当您启动Java进程时,将创建一个单独的JVM实例来运行您的进程。此外,由于props是一个类变量(而不是实例变量),因此在加载该类时,将在相应的类实例中设置它的一个副本。现在,假设您没有任何自定义类装入器,在这种情况下,行为可能会有所不同。但是对于简单的场景,您将设置系统属性,您可以通过作为java进程(JVM)一部分运行的任何类访问这些属性。

在第一个场景中,当a.java运行时,JVM将停止并释放所有值。当B.java运行时,JVM将重新启动。因此,该值将不会在整个过程中持续存在


在第二个场景中,JVM不会在执行之间停止。因此,属性值将从第二个程序中保留。

它是每个JVM实例。每个JVM实例?Aniket Thakur你能告诉我更多吗?为什么不阅读
getProperties
setProperties
并尝试一下…@DigengTianhan提供了详细的答案。如果有一个“共享”或“持久化”的属性就好了重新启动后获取它。@Spektakulaus我们可以有一个外部共享资源来存储这些属性,以便以后检索。此共享资源可以是DB、配置文件或满足相同目标的任何其他内容。
props.setProperty(key, value);