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"); // Может выбросить SecurityExceptionException 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 - NullPointerExceptionException 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.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):
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 в статическом инициализаторе класса:
public class AppConfig {
public static final String APP_VERSION = System.getProperty("app.version", "1.0.0");
}
// Запуск: java -Dapp.version=2.3.0 MyAppAppConfig.APP_VERSION = "2.3.0"
Безопасное получение свойства с проверкой на null и обработка SecurityException:
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:
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:
String arch = System.getProperty("os.arch");
if (arch.contains("64")) {
System.out.println("64-разрядная система");
} else {
System.out.println("32-разрядная система");
}64-разрядная система