2010-08-11 3 views
3

Я не совсем уверен, как я попал в эту ситуацию, но каким-то образом я получаю нулевой ClassLoader от Thread.getContextClassLoader. После небольшого чтения (не много информации в документах или в google) у меня сложилось впечатление, что для текущего потока действительно существует нулевой загрузчик классов, а вызовы getContextClassLoader должны быть проверены для нулевой ссылки.Может ли загрузчик классов контекста потока быть нулевым?

Это довольно удивительно, так как я видел пару проектов с открытым исходным кодом, которые не были проверены на getContextClassLoader (что позволило мне проверить это в первую очередь). В частности, эта линия в codemodel: JCodeModel.java line 358

(я просто проверить, что log4j не проверяет, а)

Так должны призывает getContextClassLoader проверить нулевую ссылку или что-то напутали с моими потоками?

ответ

3

Это действительно актуально для Thread.getContextClassLoader для возврата null. Не все программное обеспечение имеет особенно хорошее качество.

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

IIRC, загрузчик класса контекста потока установлен на загрузчик системного класса для основного потока, если используется команда java. Для апплетов поток апплета и EDT устанавливаются в загрузчик классов апплетов.

Я бы предложил не использовать потоковые загрузчики классов классов (или большинство других локаторов потоков), если контекст не требует этого.

+0

Вам известно, загружен ли загрузчик контекстного класса автоматически, когда собственные потоки подключены к JVM? Я не уверен, как я дошел до точки, где загрузчик контекстного класса равен нулю, потому что все работало до сих пор. –

+0

Когда создается «Thread», он наследует загрузчик класса контекста потока текущего «потока». –

+0

это родные потоки, а не потоки java. –

0

Как Tom says, это совершенно верно для Thread.getContextClassLoader(), чтобы вернуть null. Я смутно помню, что поведение по умолчанию со временем изменилось (или это могло быть другим в различных реализациях JVM-вендоров - я не помню).

Предполагая, что ненулевой контекст ClassLoader может быть действительным, если вы установили один из них вверх по стеку и не имеете внешнего кода между ними, или если требуется контракт класса/библиотеки.

В качестве примечания стороны, Class.getClassLoader() может вернуться null тоже.