Можно ли скомпилировать класс на лету в Java без использования внешних библиотек?

Мне кажется, что Java Compiler API позволяет компилировать во время выполнения класс, записывая его вывод (файл .class) в файловую систему. Однако компиляция в памяти не поддерживается. Это верно ? или можно использовать этот API для компиляции класса в памяти (из строки) и последующего создания экземпляра такого класса?

(Я знаю, что могу скомпилировать класс в файловую систему и затем загрузить его с помощью специального загрузчика классов, но мне интересно, могу ли я скомпилировать его в памяти, минуя файловую систему).

Есть ли другой альтернативный механизм для компиляции памяти с использованием только J2SE? BeanShell (библиотека, которая может делать то, что я хочу) упоминает на своей веб-странице, что она может быть включена однако в J2SE "в какой-то момент в будущем" статус его JSR является «спящим» (что бы это ни значило).

Обновление:

В идеале я хотел бы знать, можно ли это сделать только с J2SE (или есть ли какие-либо ожидаемые улучшения для J2SE, которые позволят мне сделать это, например, в Java 8). Тем не менее, советы о том, как это сделать, требуя установки JDK, также приветствуются (спасибо Evgeniy).


person Sergio    schedule 22.09.2013    source источник
comment
Скомпилируйте класс, затем загрузите его с помощью специального загрузчика классов...   -  person Boris the Spider    schedule 22.09.2013
comment
В чем причина отсутствия требования доступа к диску?   -  person Thorbjørn Ravn Andersen    schedule 22.09.2013
comment
Здравствуйте @Thorbjorn, мне это нужно для библиотеки, предназначенной для использования третьими лицами. Одна из причин заключается в том, что я пытаюсь свести к минимуму требования к моей библиотеке (например, доступность пользовательского временного каталога).   -  person Sergio    schedule 22.09.2013
comment
Я бы сказал, что компилятор в вашем пути к классу немного более ограничителен, чем временная папка.   -  person Thorbjørn Ravn Andersen    schedule 22.09.2013
comment
Возможный дубликат Как вы динамически компилируете и загружаете внешнюю java занятия?   -  person ldmtwo    schedule 15.11.2017


Ответы (2)


Это возможно, если у вас есть JDK, компилятор java находится в tools.jar, который поставляется только с JDK. См. http://docs.oracle.com/javase/7/docs/api/javax/tools/package-summary.html

person Evgeniy Dorofeev    schedule 22.09.2013
comment
но мне не нужен JDK только для использования Java Compiler API, верно? - person Sergio; 22.09.2013
comment
верно, но ToolProvider.getSystemJavaCompiler(); вернет ноль тогда - person Evgeniy Dorofeev; 22.09.2013
comment
Ясно, но вы думаете, что это позволит мне сделать компиляцию в памяти, которая мне нужна, верно? Знаете ли вы о проблемах лицензирования, которые я должен принять во внимание? Вероятно, JDK более ограничен, чем J2SE. - person Sergio; 22.09.2013
comment
1) java2s.com/Code/Java/JDK-6/CompilingfromMemory. htm 2) Я на 100% уверен, что проблем с лицензией нет - person Evgeniy Dorofeev; 22.09.2013
comment
Вам нужно что-то, реализующее Java Compiler API. Если вы не перетащите, например. компилятор Eclipse в банке, вам понадобится JDK, чтобы предоставить компилятор в javac. - person Thorbjørn Ravn Andersen; 22.09.2013

Java Compiler API .. компиляция в памяти не поддерживается. Это верно?

Нет. STBC использует JavaCompiler именно для этого.

..и создание экземпляра такого класса впоследствии?

STBC не заходит так далеко, как пытается загрузить/запустить класс, но я считаю, что это должно быть возможно. Я предполагаю, что для этого может потребоваться специальный загрузчик классов «в памяти».

.. API JavaCompiler может сделать это независимо от того, установлен JDK или нет?

Со страницы..

Системные Требования

STBC будет работать на любом компьютере с версией 1.6+ Java Plug-In* JDK (AKA SDK).

* API, который использует STBC, является просто общедоступным интерфейсом для компилятора в tools.jar, который распространяется только с JDK (хотя «общедоступная JRE» JDK, похоже, также получает tools.jar). ..

person Andrew Thompson    schedule 22.09.2013
comment
Я немного смущен, API JavaCompiler может сделать это независимо от того, установлен JDK или нет? (как сказал Евгений?) - person Sergio; 22.09.2013
comment
Пожалуйста, сделайте свои ответы самостоятельными. Ответы в форме, пожалуйста, прочитайте всю документацию, чтобы мой любимый проект имел возможности для улучшения. - person Thorbjørn Ravn Andersen; 22.09.2013
comment
@ ThorbjørnRavnAndersen Ответ был отредактирован, чтобы включить соответствующую часть, вскоре после того, как я сделал этот (теперь удаленный) комментарий. - person Andrew Thompson; 22.09.2013