Ответ 1
Нет никакого способа сделать это. JLS говорит в §12.4.1 Когда происходит инициализация (выделение мое):
Инициализация класса состоит в выполнении его статических инициализаторов и инициализаторов для статических полей, объявленных в классе. [...]
Тип класса или интерфейса T будет инициализирован непосредственно перед первым вхождением любого из следующих:
- T - это класс и создается экземпляр T.
- T - класс, и статический метод, объявленный T, вызывается.
- Назначено статическое поле, объявленное T.
- Используется статическое поле, объявленное T, и поле не является постоянной переменной (§4.12.4).
- T - класс верхнего уровня, и выполняется инструкция assert (§14.10), лексически вложенная в T.
Вызов некоторых отражающих методов в классе Class и в пакете java.lang.reflect также вызывает инициализацию класса или интерфейса. Класс или интерфейс не будут инициализированы ни при каких других обстоятельствах.
Реализация Java, которая инициализировала классы, как только они были загружены, нарушит JLS.
Хотя вы могли бы использовать API-интерфейс JVM чтобы написать ClassFileTransformer, который добавил статический блок для каждого класса, который явно инициализировал свои ссылочные классы (возможно, через Class.forName). Как только один класс будет инициализирован, все классы, доступные из него, будут инициализированы. Это может дать вам результат, который вам нужен. Это довольно много работы, хотя!