当我使用System.setProperty
来定义存储数据的参数时,我不明白?
如果说我在一个java文件中使用了System.setProperty
,那么我可以在任何地方使用这些属性吗?但事实并非如此,我不能在任何地方使用它,只能在我称为setProperty
的同一个java文件中使用。
我真的不知道为什么以及这种方法的功能是什么。
答案 0 :(得分:52)
System
类有一个名为props的static
成员变量,其类型为Properties
。除此之外,Properties
是Hashtable
类的子类型。所有属性值都存储为Key和Value。所以,datastore is Hashtable
。回答另一个问题,你可以在整个应用程序中使用System.getProperty(propertyKey)
方法,因为它是一个公共静态方法。你还没有理解java程序是如何工作的。 运行Java程序时,实际上是在启动JVM实例。该实例将具有自己的系统属性。那是你必须把你的财产。当您运行其他程序时,它将具有自己的系统属性。因此,您不能指望在一个JVM实例中设置的属性可以从另一个JVM实例访问!您可以访问在同一JVM实例中运行的所有类中的System.getProperty(propertyKey)
。希望你能理解!
答案 1 :(得分:2)
如果您看到System Class的源代码,则它具有以下类变量
private static Properties props;
对于属性类,您可以将其视为HashMap。它实际上扩展了HashMap。
public class Properties extends Hashtable<Object,Object>
致电时
setProperty(String key, String value)
它实际上是
props.setProperty(key, value);
这只是摘要(还涉及安全管理员检查)。
现在为什么我说这是每个JVM实例?
启动Java进程时,会创建一个运行进程的单独JVM实例。此外,由于props是一个Class变量(不是实例变量),因此只有一个副本存在于相应的Class实例中,该实例将在加载该类时设置。现在假设您没有任何自定义类加载器,在这种情况下行为可能会有所不同。但是对于简单的场景,您System.setProperty()
和System.getProperty()
将设置您可以通过作为该Java进程(JVM)的一部分运行的任何类访问的系统属性。
答案 2 :(得分:1)
在第一个场景中,当A.java运行时,JVM将停止并释放所有值。当B.java运行时,JVM将重新开始。因此,价值不会持续存在。
在第二种情况下,JVM不会在执行之间停止。因此,属性值将保留在第二个程序中。
答案 3 :(得分:0)
只要您的JVM实例启动,数据就会存储在内存中。它实际上与调用方法的文件无关。
你是如何运行你的应用程序的?它是存储在应用程序服务器中的Web应用程序吗? 你可以发布你的代码样本吗?