Как обеспечить загрузку Java-класса при запуске самого приложения?

У меня есть класс, расширяющий Jscience's SystemOfUnits для определения некоторых пользовательских модулей. Я хочу, чтобы этот класс был загружен JVM даже до того, как будет вызван какой-либо вызов метода Unit.valueOf().

если класс не загружен в JVM, то приведенный ниже вызов завершается неудачно, так как java.text.ParseException: dz не распознано (в dz с индексом 0)

 Unit.valueOf("dz");

-

 public final class CustomUnits extends SystemOfUnits {

 ...

 private static HashSet<Unit<?>> UNITS = new HashSet<Unit<?>>();

 public static final Unit<Dimensionless> DOZEN = customUnits(Unit.ONE
        .times(12));

 public static final Unit<Dimensionless> PIECE = customUnits(DOZEN
        .divide(12));

 static {
    UnitFormat.getInstance().label(CustomUnits.DOZEN, "dz");
    UnitFormat.getInstance().label(CustomUnits.PIECE, "pcs");
 }

 @Override
 public Set<Unit<?>> getUnits() {
    return Collections.unmodifiableSet(UNITS);
 }

 ....
 }

Также имейте в виду, что этот класс будет частью общего jar-файла, который будет доступен в качестве зависимости от других основных приложений, и я не хочу, чтобы каждый пользователь был проинформирован о том, что этот класс должен быть где-то указан до вызова Unit.valueOf().

Поиск возможных опций, которые позволили бы загружать класс, когда jar, содержащий пользовательский класс, загружается как зависимость.

Интересно, будет ли инициализация bean-компонента Spring полезной.

2 ответа

Решение

Как правило, нет возможности сообщить JVM, когда загружать класс. Класс будет загружен только когда другой класс ссылается на него.

Кроме того, AFAIU вам нужно CustomUnits не только для загрузки, но и для инициализации (для запуска статического конструктора). Инициализация может быть вызвана использованием статических членов класса, а также созданием экземпляра.

В качестве обходного пути вы можете позвонить Class.forName(...) Метод - это также гарантирует, что класс будет полностью загружен и инициализирован.

Вы пытались указать jar (с классом SystemOfUnits) как зависимость от вашего общего jar, содержащего пользовательский класс?
Вы можете добавить эти зависимости в файл манифеста jar.

Другие вопросы по тегам