Использование класса внутри блока статической инициализации класса

Возможно, это где-то обсуждалось, но я не смог его найти.

Мне нужно загрузить свойства класса (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.");
        }
    }
}
Другие вопросы по тегам