Преобразуйте строку для кодирования

Возьмите этот код: http://www.java2s.com/Code/JavaScriptReference/Javascript-Methods/scrollToExample.htm и сохраните как HTML-файл. Обратите внимание, что он жестко кодирует очень большой div больше, чем область просмотра браузера. Вам, вероятно, нужно добавить контент внизу страницы, чтобы прокрутка работала.

45
задан Minhas Kamal 27 August 2016 в 16:44
поделиться

14 ответов

Не следует. В самом деле!

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

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

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

Раз уж я здесь: прочтите также о перчатках усложнителей !

1
ответ дан 26 November 2019 в 20:55
поделиться

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

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

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

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

1
ответ дан 26 November 2019 в 20:55
поделиться

Если вы используете Java 6, вы можете попробовать Java Compiler API. В его основе лежит класс JavaCompiler . Вы должны иметь возможность создать исходный код для своего объекта Comparator в памяти.

Предупреждение: На самом деле я не пробовал приведенный ниже код, поскольку объект JavaCompiler недоступен на моей платформе, для какая-то странная причина ...

Предупреждение: Компиляция произвольного кода Java может быть опасна для вашего здоровья.

Считайте себя предупрежденным ...

String comparableClassName = ...; // the class name of the objects you wish to compare
String comparatorClassName = ...; // something random to avoid class name conflicts
String source = "public class " + comparatorClassName + " implements Comparable<" + comparableClassName + "> {" +
                "    public int compare(" + comparableClassName + " a, " + comparableClassName + " b) {" +
                "        return " + expression + ";" +
                "    }" +
                "}";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

/*
 * Please refer to the JavaCompiler JavaDoc page for examples of the following objects (most of which can remain null)
 */
Writer out = null;
JavaFileManager fileManager = null;
DiagnosticListener<? super JavaFileObject> diagnosticListener = null;
Iterable<String> options = null;
Iterable<String> classes = null;
Iterable<? extends JavaFileObject> compilationUnits = new ArrayList<? extends JavaFileObject>();
compilationUnits.add(
    new SimpleJavaFileObject() {
        // See the JavaDoc page for more details on loading the source String
    }
);

compiler.getTask(out, fileManager, diagnosticListener, options, classes, compilationUnits).call();

Comparator comparator = (Comparator) Class.forName(comparableClassName).newInstance();

После этого вам просто нужно сохранить соответствующее выражение Java в поле вашей базы данных, ссылаясь на a и b .

41
ответ дан 26 November 2019 в 20:55
поделиться

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

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

1
ответ дан 26 November 2019 в 20:55
поделиться

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

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

Конечно, если вы ДЕЙСТВИТЕЛЬНО выполняете динамические запросы таким образом, я бы рекомендовал как-то их регистрировать

1
ответ дан 26 November 2019 в 20:55
поделиться

Очевидно Платформа сценариев Java лучше для этой ситуации, но вы также можете использовать Java Compiler Api . Он предоставляет методы для компиляции исходных файлов Java из кода Java. В вашем случае вы можете создать временный файл, содержащий класс с вашим сравнительным выражением, затем вы можете загрузить этот файл и использовать его. Конечно, это не очень элегантно. Посетите http://www.juixe.com/techknow/index.php/2006/12/13/java-se-6-compiler-api/ для получения подробной информации об использовании Java Compiler Api

3
ответ дан 26 November 2019 в 20:55
поделиться

Несправедливо говорить, что это невозможно. Это очень похожая проблема на проблему Java Server Pages (JSP) - в их случае в файлы HTML встроен код, который необходимо скомпилировать в сервлет и выполнить. Если вы действительно хотели использовать этот механизм, я почти уверен, что вы могли бы покопаться в источнике для контейнера сервлетов и выяснить, как они это сделали (возможно, даже в некоторой степени повторно использовали их механизм)

. ]Тем не мение; эту проблему нелегко решить (как только вы решите очевидную, непосредственную проблему, вам придется решать проблемы с загрузкой классов и связанные с ними проблемы).

Конечно, лучше было бы пойти с Платформа сценариев Java в JDK6.

3
ответ дан 26 November 2019 в 20:55
поделиться

Вы можете использовать что-то вроде BeanShell .

8
ответ дан 26 November 2019 в 20:55
поделиться

Вы не можете, потому что java - это скомпилированный язык.

Вы, однако, должны использовать javax.script api для выполнения кода во время выполнения. JVM6 поставляется с Rhino (интерпретатор javascript), доступным через javax.script .

http://java.sun.com/javase/6/docs/api/javax/script/package-summary.html

Доступны javax.script -совместимые интерпретаторы Java (и оболочка компонента).

https://scripting.dev.java.net/

8
ответ дан 26 November 2019 в 20:55
поделиться

Groovy также может быть для вас вариантом.

Он полностью интегрируется с Bean Scripting Framework , может быть встроен напрямую довольно легко и с точки зрения синтаксиса может подойти вам.

3
ответ дан 26 November 2019 в 20:55
поделиться

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

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

1
ответ дан 26 November 2019 в 20:55
поделиться

Use Groovy!

Binding binding = new Binding();
GroovyShell shell = new GroovyShell(binding);
Object value = shell.evaluate("for (x=0; x<5; x++){println "Hello"}; return x");
22
ответ дан 26 November 2019 в 20:55
поделиться

Да, это возможно разными способами.

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

Решение может быть разным:

Вы можете, например, записать выражение БД как класс Java и вставить свой сериализованный класс в БД как глобус или blob или как он там называется.

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

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

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

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

1
ответ дан 26 November 2019 в 20:55
поделиться

Вы можете использовать BeanShell .
Ключевой класс - bsh.Interpreter .

Вот простой пример:

Interpreter interpreter = new Interpreter();
Object res = interpreter.eval("your expresion");

Можно даже определить целый класс вместо одного выражения.

8
ответ дан 26 November 2019 в 20:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: