2012-01-19 6 views
0
ClassLoader c //imagine this is a valid object 
c.loadClass(String className, boolean resolveIt); 

Это параметр className, который меня сбивает с толку. Я написал файл java в папку и скомпилировал его с помощью отражения. Я не уверен, что я указываю на правильный файл и какое соглашение об именах я использую для имени класса.Как классный загрузчик находит класс

Документация sayjust говорит имя класса, но как оно должно знать, где оно находится?

Благодаря

+0

Это то, к чему относится путь classpath. Кстати, это полное имя класса, включая иерархию пакетов. – Viruzzo

+0

@Viruzzo - то, что вы говорите, неверно в общем случае. Это может быть правильным для определенного загрузчика классов. Но могут быть классные загрузчики, которые делают это по-разному (например, получить данные класса из базы данных). – Ingo

+0

@Ingo Я имел в виду загрузчик классов по умолчанию; Я думаю, что он интересовался дефолтным случаем, а не общим. – Viruzzo

ответ

2

Точка в ClassLoader точно знать, как искать файлы классов данных имя класса. Javadoc говорит:

Учитывая бинарное название класса, который загрузчик должен попытаться найти или генерировать данные, составляющие определение класса. A типичной стратегией является преобразование имени в имя файла, а затем читает «файл класса» этого имени из файловой системы.

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

0

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

Например, URLClassLoader будет обращаться к пути к классу и посмотреть, может ли он найти файл, содержащий названный класс.

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