System.setProperty和System.getProperty

时间:2014-01-18 12:50:08

标签: java

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

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

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

4 个答案:

答案 0 :(得分:52)

System类有一个名为props的static成员变量,其类型为Properties。除此之外,PropertiesHashtable类的子类型。所有属性值都存储为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应用程序吗? 你可以发布你的代码样本吗?