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