System.setProperty和System.getProperty
当我使用System.setProperty
来定义存储数据的参数时,我不明白?
如果说我在一个java文件中使用了System.setProperty
,那么我可以在任何地方使用这些属性吗? 但事实并非如此,我不能在任何地方使用它,只能在我称为setProperty
的同一个java文件中。
我真的不知道为什么以及这种方法的function是什么。
System
类有一个名为props的static
成员变量,其Properties
为Properties
。 除此之外, Properties
是Hashtable
类的子类型。 所有属性值都存储为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应用程序吗? 你可以发布你的代码样本吗?