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