Преобразовать строку в код - PullRequest
44 голосов
/ 01 июня 2009

Я хочу знать, есть ли способ конвертировать String в компилируемый код Java.

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

Есть ли способ сделать это?

Ответы [ 18 ]

1 голос
/ 01 июня 2009

Если все, что вам действительно нужно, это оценить выражение, хранящееся в базе данных, вы можете посмотреть на JEP (Java Expression Parser)

Последняя (коммерческая) версия здесь .

Немного более старая версия GPL здесь

Некоторые примеры использования .

1 голос
/ 03 мая 2011

Было бы гораздо лучше сопоставить информацию о состоянии вашей базы данных с объектом и либо реализовать на нем метод equals, который вы можете использовать с BeanPropertyValueEqualsPredicate из beanutils для Apache commons, либо вместо этого реализовать Comparable. Это должно делать то, что вам нужно, без всякой магии компиляции или проблем безопасности при преобразовании строк в код.

1 голос
/ 23 июля 2009

Да, это возможно во многих отношениях.

Как уже упоминалось выше, Java 6 позволяет вам анализировать, манипулировать и переписывать код во время загрузки!

Решение может варьироваться:

Вы можете, например, написать выражение вашей БД как класс Java и вставить свой сериализованный класс в БД как глобус или большой двоичный объект или как там его называют.

Или вы можете использовать шаблон, чтобы записать класс Java в файл и вставить в него свое выражение. Затем скомпилируйте класс во время выполнения (например, от JSP к сервлету) и затем динамически загрузите класс.

Конечно, вы хотите кэшировать скомпилированные классы для будущего использования, если они не были отредактированы в базе данных.

Тогда есть также возможность использования встроенного скриптового движка, как упоминалось в большинстве ответов.

Независимо от того, что вы выберете, возможно, вы сможете обновить этот пост, указав сведения о вашем выборе, реализации, проблемах, заметках, комментариях и т. Д.

1 голос
/ 02 июня 2009

Если вы готовы пожертвовать частью «кода Java» своего требования, вы можете использовать библиотеку Java Mathematic Expression Evaluator . Он позволяет указать математическое выражение (как java.lang.String), добавить значения для переменных и затем оценить выражение.

Я с большим успехом использовал его в рабочем коде.

1 голос
/ 01 июня 2009

Ты не должен. В самом деле!

Вы изобретаете другой движок корпоративных правил? . Возможно, вы захотите прочитать эти ссылки.

Примите во внимание тот факт, что единственные люди, которые достаточно опытны, чтобы написать код и затем вставить его в базу данных, вероятно, все равно имеют редактор и компилятор ...

Компилятор перехватит все эти надоедливые синтаксические ошибки, и вы даже сможете протестировать код! Помните, что были изобретены редакторы и компиляторы, и даже компьютерные языки, чтобы помочь программисту с комфортом писать понятный код с разумными усилиями.

Пока я в этом: читайте о перчатках усложняющих тоже!

1 голос
/ 01 июня 2009

Если вы получаете условие из базы данных, я держу пари, что есть большая вероятность, что вы захотите использовать это условие для доступа к данным в этой базе данных.

Если вы используете ORM, такой как JPA или Hibernate (традиционный или JPA), вы можете составить динамическое выражение запроса, которое вы передадите методу createQuery (). Это не так хорошо, как возможность на лету компилировать произвольный код Java, но, возможно, это все, что вам нужно, и это конкретное решение не требует каких-либо специальных включений или действий, поскольку компилятор языка запросов часть самой системы ORM.

Конечно, если вы ДЕЛАЕТЕ динамические запросы таким образом, я бы порекомендовал как-то их регистрировать, так как было бы очень сложно выяснить, что пошло не так после того, как ваша строка запроса теперь находится в сборщике мусора.

1 голос
/ 01 июня 2009

Простой способ получить фрагменты кода в исполняемый байт-код - использовать библиотеку Javassist.

Возможно, вы сможете адаптировать методы, описанные в http://www.ibm.com/developerworks/java/library/j-dyn0610/, к вашим потребностям.

0 голосов
/ 15 мая 2014

Я использовал и BeanShell, и GroovyShell, но с точки зрения производительности GroovyShell работает намного быстрее, если вы вставляете и кешируете скрипт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...