Может ли отражение в классах случайно вызвать методы (например, статические конструкторы)? - PullRequest
3 голосов
/ 04 марта 2012

Я написал некоторый код для анализа всех пакетов / классов, которые поставляются в комплекте с API Java 1.6.Это означает, что нужно перебирать все классы, выполняя с ними функции отражения, для генерации статистики.

Ни один из этого кода на самом деле не создает экземпляры классов и не вызывает из них какие-либо методы: я просто делаю такие вещи, как вызов getDeclaredMethods() и getDeclaredFields().

Это нормально для большинства классов (почти все в пакете java.* или javax.*).Однако некоторые другие классы ломают мою программу, вызывая исключения вроде:

WARNING: "IOP00710208: (INTERNAL) Unable to determine local hostname from InetAddress.getLocalHost().getHostName()"
org.omg.CORBA.INTERNAL:   vmcid: SUN  minor code: 208  completed: No

Это кажется странной проблемой.Может ли быть так, что, когда я ссылаюсь на этот класс (например, вызывая Class.forName()), он вызывает статические конструкторы в этом классе?Например, если класс является фабричным классом или имеет конечные поля, для которых уже были созданы экземпляры?

Я решил проблему с классами, генерирующими исключения, когда смотрел на них, помещая все в блок try/catch(Throwable).

Мне любопытно, что вызвало эти исключения.Это, как я думал, статические конструкторы и тому подобное?Я не могу найти источник (может быть, я просто ищу не в том месте ...!) Для этих классов, поэтому я не могу проверить себя ...

Ответы [ 2 ]

3 голосов
/ 04 марта 2012

Да, загрузка класса (например, через class.forName()) может привести к запуску статического инициализатора В приведенном ниже примере при загрузке этого класса будет выведено «Hello»:

public class Demo{   
  static{
    System.out.println("Hello");
  }
}
1 голос
/ 04 марта 2012

без параметров forName явно загружает класс, к которому он вызывается, с помощью , и именно тогда вызываются статические инициализаторы (более или менее).Вы можете попробовать вызвать вариант , который принимает boolean initialize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...