Используйте собственный загрузчик классов во время компиляции

Можно ли указать собственный загрузчик классов для javac (или какой-либо альтернативный компилятор java)?

Я был бы рад такому подвигу, потому что он позволил бы мне компилировать классы, использующие классы, которые можно найти только с помощью моего специального загрузчика классов.

Для любопытных: я бы написал класслодер, который подключается к базе данных и создает классы на основе найденных таблиц.


person Jens Schauder    schedule 03.06.2009    source источник


Ответы (6)


Когда вы запускаете javac, вы можете указать загрузчик классов следующим образом:

javac -J-Djava.system.class.loader=org.awesome.classloader sourcefile.java
person Hardwareguy    schedule 03.06.2009
comment
Я продолжаю получать ClassNotFoundException. Я не знаю, что я делаю неправильно. - person Edoardo Vacchi; 04.09.2012
comment
установите путь к классам аналогичным образом: javac -J-Djava.class.path=./my-jar.jar -J-Djava.system.class.loader=xxxx file.java - person David Nichols; 24.12.2020

Можно инициализировать собственный загрузчик классов, а затем использовать его при вызове нового API компилятора Java 6 в javax.tools.

person Michael Borgwardt    schedule 03.06.2009

Единственные два известных мне способа прямого подключения к javac (при запуске в командной строке) — это через обработчик аннотаций или через специфичный для компилятора хак.

person McDowell    schedule 03.06.2009
comment
Получите 404 для ссылки на взлом для конкретного компилятора, вот ссылка на web.archive.org: web.archive.org/web/20140819224858/http://www.iam.unibe.ch/ - person Grant Peters; 25.01.2016

Чтобы расширить ответ Майкла, если вы не можете использовать Java6, посмотрите на солнце. пакеты - они всегда были доступны для java-приложений и всегда имели там компилятор, это просто не стандартная Java, поэтому вы мало что об этом слышите, и API может быть изменен (например, перемещен в javax.tools упаковка!)

person Bill K    schedule 03.06.2009

Взгляните на ClassLoader.defineClass. Я сам использовал его для загрузки плагинов в созданную мной программу, в которой я загружал байты файла в новый класс.

person Patrick    schedule 03.06.2009

Если все классы соответствуют одному и тому же интерфейсу, вы можете просто указать это во время компиляции.

Если нет, то я не вижу, что вы получаете, не выводя файлы .java на основе БД и не компилируя их.

person Chris Nava    schedule 03.06.2009
comment
«Проблема» с генерацией java-файлов и их компиляцией заключается в том, что это отдельный шаг. Поэтому, если кто-то меняет базу данных, классы не подходят, и вы получаете загадочные исключения sql. - person Jens Schauder; 05.06.2009