Использование класса внутри блока статической инициализации класса
Возможно, это где-то обсуждалось, но я не смог его найти.
Мне нужно загрузить свойства класса (java.util.Properties
) внутри блока статической инициализации класса. Это позволяет получить доступ к некоторым общим параметрам класса даже без создания его объектов. Для этого мне нужно соответствующее Class
объект. Но, конечно, не удается получить доступ к такому объекту класса null
объект. Что-то вроде этого.
Class Name {
private static Properties properties;
static {
Name.properties = new Properties();
Name.properties.load(Name.class.getResourceAsStream("Name.properties"));
}
}
Есть идеи, как справиться с этой ситуацией?
ОБНОВИТЬ:
Это было имя ресурса (должно быть "/Name.properties" для моего случая). Все остальное было в порядке.
+1 для всех значимых ответов от меня и... не забудьте проверить операции по очереди:-).
3 ответа
properties
поле должно быть static
, И раньше load
вам нужно инициализировать статическую переменную с proeprties = new Properties()
после этого вы можете вызвать load
Объявите свойства как статические и инициализируйте
static Properties properties;
или же
static Properties properties = new Properties();
и статический блок должен быть
static {
try {
properties = new Properties(); //if you have not initialize it already
Name.properties.load(Name.class.getResourceAsStream("Name.properties"));
} catch (IOException e) {
throw new ExceptionInInitializerError(e); //or some message in constructor
}
}
Вам нужно поймать IOException при загрузке файла свойств
Окончательный код, основанный на всех предложениях, выглядит следующим образом:
Class Name {
private static final Properties properties = new Properties();
static {
try {
InputStream stream = Name.class.getResourceAsStream("/Name.properties");
if (stream == null) {
throw new ExceptionInInitializerError("Failed to open properties stream.");
}
Name.properties.load(stream);
} catch (IOException e) {
throw new ExceptionInInitializerError("Failed to load properties.");
}
}
}