System.getProperty: примеры (JAVA)

Примеры работы с System.getProperty в Java
Раздел: Работа с системными свойствами и окружением
System.getProperty(String key): String

Описание System.getProperty

Метод System.getProperty является статическим методом класса java.lang.System. Он предназначен для получения значений системных свойств Java Virtual Machine (JVM). Системные свойства представляют собой пары «ключ-значение», которые описывают окружение JVM и операционной системы. Метод используется, когда приложению требуется узнать информацию о версии Java, об операционной системе, о текущем пользователе, разделителях путей и т.д.

Метод имеет две перегруженные формы:

  • String getProperty(String key) - возвращает значение свойства по указанному ключу. Если свойство не найдено, возвращается null. Если ключ равен null, выбрасывается исключение NullPointerException.
  • String getProperty(String key, String defaultValue) - возвращает значение свойства по ключу. Если свойство не найдено, возвращается значение defaultValue. Этот вариант позволяет избежать проверки на null.

Возвращаемое значение - строка, представляющая значение системного свойства. Если свойство отсутствует и не указано значение по умолчанию, возвращается null.

Метод может вызывать исключение SecurityException, если менеджер безопасности не разрешает доступ к запрашиваемому свойству.

Некоторые распространённые ключи:

java.versionверсия Java Runtime Environment
java.vendorпоставщик JRE
os.nameимя операционной системы
os.archархитектура ОС
user.nameимя текущего пользователя
user.homeдомашняя директория пользователя
user.dirтекущая рабочая директория
file.separatorразделитель компонентов пути файловой системы (например, / или \)
path.separatorразделитель путей в переменной окружения PATH (например, : или ;)
line.separatorсимвол перевода строки

Примеры использования

Базовое получение свойства с ключом java.version:

String version = System.getProperty("java.version");
System.out.println(version);
17.0.6

Использование со значением по умолчанию:

String os = System.getProperty("os.name", "Unknown OS");
System.out.println(os);
Linux

Если свойство отсутствует, возвращается значение по умолчанию:

String custom = System.getProperty("my.custom.property", "default");
System.out.println(custom);
default

Получение нескольких свойств:

System.out.println("java.vendor: " + System.getProperty("java.vendor"));
System.out.println("user.home: " + System.getProperty("user.home"));
System.out.println("user.dir: " + System.getProperty("user.dir"));
java.vendor: Oracle Corporation
user.home: /home/user
user.dir: /home/user/project

Использование ключа с несуществующим свойством (возвращается null):

String unknown = System.getProperty("nonexistent.key");
System.out.println("unknown = " + unknown);
unknown = null

Похожие функции в Java

  • System.getenv(String name) - возвращает значение переменной окружения операционной системы. Отличие: getProperty читает свойства JVM, а getenv - переменные окружения ОС. Для доступа к переменным окружения следует использовать getenv.
  • java.util.Properties - класс для работы с наборами свойств. Можно загрузить системные свойства через System.getProperties() и работать с ними как с объектом Properties. Это позволяет перечислять все свойства или сохранять их в файл.
  • java.util.prefs.Preferences - API для хранения пользовательских и системных настроек. Предпочтительнее для долговременного хранения конфигурации приложения, так как обеспечивает типизированный доступ и поддержку иерархии.

System.getProperty стоит использовать для чтения стандартных свойств JVM, а для пользовательских параметров запуска (например, переданных через -D) - тоже через этот метод. Для переменных окружения ОС применяется System.getenv. Для настроек приложения более подходит Preferences.

Аналоги в других языках

В разных языках функциональность получения переменных окружения или системных параметров реализована по-своему.

  • PHP - функция getenv() возвращает значение переменной окружения. Пример:
    echo getenv('HOME');
    /home/user
    Отличие: PHP не имеет встроенного понятия системных свойств JVM; доступны только переменные ОС.
  • JavaScript (Node.js) - объект process.env содержит переменные окружения. Пример:
    console.log(process.env.HOME);
    /home/user
    В браузере window.navigator предоставляет некоторые параметры (userAgent и т.д.), но нет прямого аналога.
  • Python - словарь os.environ или метод os.getenv(). Пример:
    import os
    print(os.getenv('HOME'))
    /home/user
    Отличие: Python предоставляет переменные окружения, а не свойства виртуальной машины.
  • SQL - нет прямого аналога, но в некоторых СУБД есть системные функции: @@VERSION в SQL Server, VERSION() в MySQL. Эти функции возвращают информацию о версии СУБД, но не о системе.
  • C# - класс Environment со статическим методом GetEnvironmentVariable. Пример:
    string home = Environment.GetEnvironmentVariable("HOME");
    Console.WriteLine(home);
    /home/user
    Также есть Environment.OSVersion для информации об ОС.
  • Lua - функция os.getenv для переменных окружения. Пример:
    print(os.getenv("HOME"))
    /home/user
  • Go - пакет os с функциями os.Getenv и os.LookupEnv. Пример:
    home := os.Getenv("HOME")
    fmt.Println(home)
    /home/user
    Отличие: Go также позволяет получить переменные ОС, но не имеет встроенной концепции системных свойств, как в Java.
  • Kotlin - использует тот же System.getProperty для свойств JVM, а для переменных окружения - System.getenv(). Дополнительно могут быть расширения в стандартной библиотеке, например System.getProperty может быть вызван с делегатами. Отличий от Java практически нет.

Главное отличие аналогов - в Java System.getProperty даёт доступ к свойствам, определённым при запуске виртуальной машины (в том числе через -D), а не только к переменным ОС. В других языках, как правило, доступны только переменные окружения.

Типичные ошибки при использовании

  • NullPointerException - передача null в качестве ключа. Пример:
    String val = System.getProperty(null); // Ошибка
    Исключение возникает на этапе выполнения.
  • SecurityException - если установлен менеджер безопасности и он не разрешает доступ к свойству. Пример:
    // Включён SecurityManager
    String pwd = System.getProperty("user.dir"); // Может выбросить SecurityException
    Exception in thread "main" java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.dir" "read")
    Ошибка возникает при попытке прочитать защищённое свойство.
  • Непредвиденный null - вызов getProperty(key) без значения по умолчанию и последующее использование результата без проверки на null может привести к NullPointerException в других частях кода. Пример:
    String path = System.getProperty("custom.path");
    File file = new File(path); // Если path == null - NullPointerException
    Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because the parameter is null
    Рекомендуется использовать двухпараметровую версию или явно проверять на null.
  • Опечатки в ключах - неверное имя свойства (например, 'java.verson' вместо 'java.version') возвращает null (или значение по умолчанию), что может быть неочевидно.
  • Игнорирование различий регистра - ключи чувствительны к регистру. System.getProperty("os.NAME") вернёт null.

Изменения в последних версиях

Метод System.getProperty не претерпевал существенных изменений с момента появления. Все изменения касались добавления новых ключей системных свойств. Например:

  • Java 8 добавила свойство java.specification.version и другие, связанные со спецификацией.
  • Java 9 ввела модульную систему, с которой появились свойства java.module.* (например, java.module.path).
  • Java 11 не внесло изменений в сам метод, но некоторые свойства могли быть изменены (например, java.version стал возвращать версию без указания обновления для новых форматов).
  • Java 17 и более поздние версии поддерживают все предыдущие ключи, а также добавлены свойства для управления записями (records) и sealed-классами в разделе java.class.path и т.д.

В целом сигнатура метода и его поведение остаются стабильными на протяжении многих лет.

Расширенные примеры

Пример вывода всех системных свойств с фильтрацией по префиксу 'java':

Пример java
java.util.Properties props = System.getProperties();
props.stringPropertyNames().stream()
    .filter(key -> key.startsWith("java"))
    .forEach(key -> System.out.println(key + " = " + props.getProperty(key)));
java.version = 17.0.6
java.vendor = Oracle Corporation
java.vendor.url = https://java.oracle.com/
java.home = /usr/lib/jvm/java-17-openjdk-amd64
java.class.version = 61.0
...

Получение пути к домашней директории с учётом ОС (через file.separator):

Пример java
String home = System.getProperty("user.home");
String sep = System.getProperty("file.separator");
String logDir = home + sep + "logs" + sep + "app.log";
System.out.println(logDir);
/home/user/logs/app.log

Использование System.getProperty в статическом инициализаторе класса:

Пример java
public class AppConfig {
    public static final String APP_VERSION = System.getProperty("app.version", "1.0.0");
}
// Запуск: java -Dapp.version=2.3.0 MyApp
AppConfig.APP_VERSION = "2.3.0"

Безопасное получение свойства с проверкой на null и обработка SecurityException:

Пример java
String value = null;
try {
    value = System.getProperty("restricted.property");
} catch (SecurityException e) {
    System.err.println("Доступ запрещён: " + e.getMessage());
    value = "fallback";
}
System.out.println(value);
fallback (если SecurityException)

Сравнение поведения getProperty с getenv на примере переменной PATH:

Пример java
System.out.println("System.getProperty(\"path.separator\") = " + System.getProperty("path.separator"));
System.out.println("System.getenv(\"PATH\") = " + System.getenv("PATH"));
System.getProperty("path.separator") = :
System.getenv("PATH") = /usr/local/bin:/usr/bin:/bin

Получение архитектуры процессора через os.arch:

Пример java
String arch = System.getProperty("os.arch");
if (arch.contains("64")) {
    System.out.println("64-разрядная система");
} else {
    System.out.println("32-разрядная система");
}
64-разрядная система

джава System.getProperty function comments

En
System.getProperty Gets the system property indicated by the specified key