Есть ли способ в Java для доступа к информации о типе во время выполнения без полной загрузки класса? - PullRequest
3 голосов
/ 25 января 2010

Я пытаюсь получить ссылку на java.lang.Class, который находится на моем пути к классам, и посмотреть на членов на нем с отражением. Проблема в том, что я пытаюсь сделать это только с неполным путем к классам. Под этим я подразумеваю, что путь к классам содержит все интересующие меня классы, но не обязательно содержит дополнительные классы, от которых эти классы могут зависеть. Поэтому невозможно полностью загрузить класс обычным способом.

Возможно ли это?

Ответы [ 5 ]

2 голосов
/ 25 января 2010

Ничего страшного, вы должны сталкиваться с ошибками ClassNotFound только тогда, когда эти классы вызываются и должны быть загружены. Я не думаю, что это будет иметь место, если вы не создаете экземпляры классов, даже если эти классы импортируют другие, которые отсутствуют.
Однако, если ваш класс делает какие-либо статические инициализирующие ссылки на недоступные классы, исключения могут создаваться даже без создания экземпляров класса.

2 голосов
/ 25 января 2010

Вы можете использовать ASM для анализа файла .class без загрузки класса

1 голос
/ 25 января 2010

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

0 голосов
/ 25 января 2010

Вы должны «расширить» ваш путь к классу.Вы можете создать собственный загрузчик классов (вам придется читать документ, я делал это 5 лет назад, но я не помню деталей).

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

Вы можете получить доступ к этим загруженным классам через отражение.Но никогда статически.

Если вы предоставите загрузчику классов родительский объект, он "унаследует" классы, уже находящиеся в пути к классам.Если нет, он будет использовать загрузчик классов начальной загрузки.

Редактировать , если нет зависимых классов, это вызовет ошибку.Вы должны создать загрузчик классов, который имеет ВСЕ классы, на которые имеются прямые ссылки.

0 голосов
/ 25 января 2010

Если эти классы, которые могут понадобиться, не находятся в пути к классам (например, если ему нужен другой jar, на который нет ссылок), вы, вероятно, столкнетесь с ошибкой.

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

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