Как я могу скомпилировать java-код из произвольной строки (в памяти) в Java 5 и Java 6, загрузить ее и запустить на ней определенный метод (предопределенный)?
Прежде чем вы начнете плакать, я просмотрел существующие реализации:
- Большинство полагаются на API компилятора Java 6.
- Те, кто этого не делает, полагаются на трюки.
- Да, я проверил commons-jci. Либо я слишком плотный, чтобы понять, как это работает, либо просто не работает.
- Я не мог найти, как передать компилятор моему текущему пути к классу (который довольно большой).
- В реализации, которая работала (в Java 6), я не мог найти, как правильно загружать внутренние классы (или внутренние анонимные классы).
- Мне бы очень понравилось, если бы все было в памяти, так как все работает в нескольких средах.
Я уверен, что это было решено раньше, но я не могу найти ничего, что бы выглядело даже полупроизводственного качества в google (кроме jci, который, как я уже говорил, мне не удалось использовать).
Изменить:
- Я просмотрел JavaAssist - мне нужны внутренние классы, поддержка языкового уровня Java 5.0 и компиляция с помощью всего пути к классам. Кроме того, я хотел бы создавать новые классы "на лету". я может быть ошибочно, но я не мог найти, как это сделать с помощью JavaAssit.
- Я хочу использовать решение на базе файловой системы (вызов javac), но я не знаю, как божественный путь к классам, и как позже загружать файлы (которые не входят в мой путь к классам) со специальным загрузчиком классов которые могут быть переработаны для нескольких вызовов. Хотя я действительно знаю, как его исследовать, я бы предпочел готовое решение.
Edit2: На данный момент я доволен тем, что BeanShell "оценивает". По-видимому, он делает все, что мне нужно (получить строку, оценить ее в контексте "текущего" класса. Он пропускает некоторые функции Java 5, но он может использовать перечисления (не определять) и скомпилировать "общий" (стирать), поэтому этого должно быть достаточно для того, что я хочу.
Я не хочу отмечать ответ как принятый, так как я надеюсь на лучшее решение.
Edit3: Принято предложение beanshell - оно действительно работает чудесно.