System.setProperty和System.getProperty

当我使用System.setProperty来定义存储数据的参数时,我不明白?

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

我真的不知道为什么以及这种方法的function是什么。

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

如果您看到System Class的源代码,则它具有以下类变量

 private static Properties props; 

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

 public class Properties extends Hashtable 

你打电话时

 setProperty(String key, String value) 

它确实如此

 props.setProperty(key, value); 

这只是摘要(还涉及安全管理器检查)。

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

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

在第一个场景中,当A.java运行时,JVM将停止并释放所有值。 当B.java运行时,JVM将重新开始。 因此,价值不会持续存在。

在第二种情况下,JVM不会在执行之间停止。 因此,属性值将从第二个程序中继续存在。

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

你是如何运行你的应用程序的? 它是存储在应用程序服务器中的Web应用程序吗? 你可以发布你的代码样本吗?