Мне нужно работать с кучей статических классов устаревших, содержащих static
блоков. Классы сами по себе являются только вспомогательными классами с использованием только статических методов.Как инициализировать статические блоки?
Пример:
public abstract class Legacy {
protected static final String[] ARRAY;
static {
//init that ARRAY
}
public static String convert(String value) {
//makes use of the ARRAY variable
}
}
Важно: У меня нет контроля над источниками и, таким образом, не может изменить код. Я знаю, что это серьезный недостаток дизайна в том, как создается класс.
Проблема: при обращении к классу одновременно я получаю исключения из унаследованных классов, если класс еще не инициализирован. Поэтому я должен обеспечить при запуске приложения, что каждый статический класс был инициализирован правильно раньше.
Но как я мог это сделать?
Я попытался следующим образом:
Legacy.class.newInstance();
Но это приводит к следующей ошибке:
java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at java.lang.Class.newInstance(Class.java:374)
Так что, вероятно, что я делаю неправильно?
Статический метод и поля класса сначала инициализируются загрузчиком класса java, когда класс впервые ссылается на код. – kai
Ну, так как это просто обход другой проблемы, мы должны сосредоточиться на главной проблеме, не так ли? Какое исключение вы упомянули? («Я получаю исключения, если класс еще не инициализирован») – Tom
Статические инициализаторы будут запускаться только один раз, в одном потоке ... возможно, вы могли бы привести несколько примеров того, о чем вы говорите. Попытка построить * экземпляр * класса без доступных конструкторов - не очень хорошая идея. –