System.setProperty и System.getProperty

Я не понял, когда я использовал System.setProperty для определения параметра, где хранятся данные?

Если скажу, что я использовал System.setProperty в одном java файле, то могу ли я использовать свойства в любом месте? Но это не так, я не могу использовать его нигде, только в том же java файле, который я назвал setProperty.

Я действительно не знаю, почему и какова функция этого метода.

Ответ 1

System класс имеет переменную-член static с именем реквизита, который имеет тип Properties. Добавляя к этому, Properties является подтипом класса Hashtable. Все значения свойств хранятся в виде ключа и значения. Итак, datastore is Hashtable. Отвечая на другой вопрос, вы можете очень хорошо использовать метод System.getProperty(propertyKey) во всем своем приложении, поскольку он является общедоступным статическим методом. Вы не поняли, как работают Java-программы. При запуске Java-программы вы фактически запускаете экземпляр JVM. У этого экземпляра будут свои собственные свойства System. Вот где вы должны положить свою собственность. Когда вы запускаете другую программу, у нее будут свои собственные свойства System. Таким образом, вы не можете ожидать, что свойство, которое вы установили в одном экземпляре JVM, будет доступно из другого экземпляра JVM! Вы можете получить доступ к System.getProperty(propertyKey) во всех классах, работающих в одном экземпляре JVM. Надеюсь, вы поймете!

Ответ 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, который запускает ваш процесс. Кроме того, поскольку реквизит является переменной класса (а не переменной экземпляра), только одна копия будет присутствовать в соответствующем экземпляре класса, который будет установлен при загрузке этого класса. Теперь это предполагает, что у вас нет каких-либо пользовательских загрузчиков классов, в этом случае поведение может быть другим. Но для упрощенного сценария вы System.setProperty() и System.getProperty() зададите системные свойства, к которым вы можете получить доступ, через любой класс, выполняемый как часть этого java-процесса (JVM).

Ответ 3

Данные сохраняются в памяти до тех пор, пока ваш экземпляр JVM не работает. Это действительно не связано с файлом, который вызвал методы.

Как вы запускаете свое приложение? Является ли это веб-приложение, хранящееся в приложении? Можете ли вы опубликовать образец своего кода?

Ответ 4

Я определяю два java файла A.java и B.java

A.java вот так:

public static void main(String[] args) {
        System.setProperty("system.project_name", "springsilkworm");
    }

B.java как это

public static void main(String[] args) {
        System.out.println(System.getProperty("system.project_name"));
    }

Я запустил A, затем запустил B, я не могу получить свойство

когда я использовал это в веб-приложении, я определил два контроллера: AController.java и BController.java

AController.java вот так:

@RequestMapping(method = RequestMethod.GET)
    public String printWelcome(ModelMap model) {
        System.setProperty("system.project_name", "springsilkworm");
        model.addAttribute("message", "Spring 3 MVC Hello World");
        return "hello";

    }

BController.java вот так:

@RequestMapping(method = RequestMethod.GET)
    public String printWelcome(ModelMap model) {
        System.out.println(System.getProperty("system.project_name"));
        return "hello";

    }

Я посещаю A, затем нахожу B, в этой ситуации BController может посетить свойство system.project_name

Итак, я не могу понять область действия свойства по вызову System.setProperty