当我使用 System.setProperty
来定义参数时,我不知道数据存储在哪里?
比如说,我在一个java文件中使用了 System.setProperty
, 那么我可以在任何地方使用这个属性吗?但事实并非如此,我只能在调用 setProperty
的同一个java文件中使用它。
我真的不知道这个方法的作用和原因是什么。
当我使用 System.setProperty
来定义参数时,我不知道数据存储在哪里?
比如说,我在一个java文件中使用了 System.setProperty
, 那么我可以在任何地方使用这个属性吗?但事实并非如此,我只能在调用 setProperty
的同一个java文件中使用它。
我真的不知道这个方法的作用和原因是什么。
System
类有一个名为props的static
成员变量,它的类型是Properties
。此外,Properties
是Hashtable
类的子类型。所有属性值都存储为键和值。因此,datastore是Hashtable
。回答另一个问题,您可以在整个应用程序中使用System.getProperty(propertyKey)
方法,因为它是一个公共静态方法。您没有理解java程序如何工作。当您运行Java程序时,实际上启动了一个JVM实例。该实例将具有自己的系统属性。这就是您必须放置属性的位置。当您运行其他程序时,该程序将具有自己的系统属性。因此,您不能指望在一个JVM实例中设置的属性可从另一个JVM实例访问!您可以在同一JVM实例中运行的所有类中访问System.getProperty(propertyKey)
。希望您能理解!
private static Properties props;
关于 properties 类,你可以把它看作是一个 HashMap。它实际上继承了 HashMap。
public class Properties extends Hashtable<Object,Object>
当您调用时
setProperty(String key, String value)
它实际上确实做到了
props.setProperty(key, value);
这只是一个总结(安全管理器检查也涉及其中)。
那么我为什么说它是每个JVM实例?
当您启动Java进程时,将创建一个单独的JVM实例来运行您的进程。此外,由于props是类变量(而不是实例变量),因此在相应的Class实例中只会存在一个副本,该副本将在加载该类时设置。现在,在假设您没有任何自定义类加载器的情况下,简化的场景下,您可以通过System.setProperty()
和System.getProperty()
设置系统属性,以便您可以通过作为该Java进程(JVM)的一部分运行的任何类访问它们。
只要您的JVM实例在运行,数据就会存储在内存中。这与调用方法的文件无关。
您是如何运行应用程序的?它是存储在应用程序服务器中的Web应用程序吗? 您能发布一下您代码的示例吗?