2016-01-14 2 views
3

Существует следующая PMD правило:Правило PMD «Использовать надлежащий загрузчик классов»?

Использование собственного класса Loader (Critical)

В J2EE getClassLoader() не может работать, как ожидалось. Вместо этого используйте Thread.currentThread().getContextClassLoader().

Может несколько объяснить больше, о чем они думают? Что означает среда J2EE?

ответ

1

Среда J2EE относится к Java Enterprise Edition. Здесь вы не запускаете свою программу как отдельное приложение на JVM, но вместо этого вы позволяете серверу приложений JEE (например, Glassfish или Tomcat) запускать его для вас.

Серверы приложений предоставляют множество различных способов запуска вашей программы, например, они предлагают одновременное и распределенное выполнение. AppServers играют с загрузчиками классов, иногда есть иерархия, например, EAR (Enterprise ARchive) имеет один, а WAR (Web ARchive) внутри EAR имеет другую. Из-за этого не гарантируется, что вы всегда получите правильный ClassLoader с вызовом getClassLoader(). С Thread.currentThread().getContextClassLoader() вы всегда получите ClassLoader, который загрузил ваше приложение.

(Примечание: это не совсем так, некоторые приложения делают трюк с ContextClassLoader (например, Spring, OSGi). Тем не менее, это лучший способ получить ваш правильный ClassLoader).

+0

«получить право ClassLoader» - эта часть неясна. если я скажу: 'ref.getClass(). getClassLoader()', я должен получить загрузчик классов, который загрузил этот класс, правильно? Как это можно изменить? Я не говорю о загрузчике классов, загружающем мое приложение; так как мой класс может быть загружен разными загрузчиками классов. – igr

+0

Возможно, это сообщение разъясняет это: http://stackoverflow.com/questions/1771679/difference-between-threads-context-class-loader-and-normal-classloader – Csuki

+0

Хм, я понимаю разницу, может быть, мне нужно уточнить себя. Если я делаю 'ref.getClass(). GetClassLoader()' - я всегда должен получить загрузчик классов, который загрузил класс 'ref'. И это не может измениться, не так ли? Это может быть или не быть таким же, как контекст CL, но для меня это необходимо, если нужно. Иногда я хочу этого, иногда я этого не делаю. Поэтому я озадачен тем, почему PMD предупредил об этом в любом случае - это звучит как правило, что вы должны использовать в среде jee - и задаться вопросом, есть ли что-то большее, чего я не вижу. – igr

Смежные вопросы