2017-01-08 2 views
3

Существует вопрос с тем же названием, что и на stackoverflow here, но я хотел спросить, можно ли сделать что-то подобное в Java.Как преобразовать строку в функцию в Java?

Я хотел сделать что-то похожее на desmos, точно так же, как этот парень сделал в Javascript, но я хочу сделать его на Java с помощью lwjgl 2. Я новичок в Java, и мне хотелось бы знать, возможно ли конвертировать кусок строки в метод. Является ли это возможным?

Я искал возможные варианты, и я узнал, что вы можете создать свой собственный метод Java eval(). Но я не хочу заменять x в строке для каждого пикселя ширины окна.

Заранее спасибо.

ответ

5

Что вам нужно - это движок/библиотека, которая может оценивать выражения, определяемые как строка во время выполнения. Если вы поместите оценочный код в вызов функции (например, лямбда-функцию), вы получите то, что вам нужно.

Вариант 1: Вы можете использовать exp4j. exp4j - небольшая библиотека, позволяющая оценивать выражения и функции во время выполнения. Вот пример:

Expression e = new ExpressionBuilder("3 * sin(y) - 2/(x - 2)") 
     .variables("x", "y") 
     .build() 
     .setVariable("x", 2.3) 
     .setVariable("y", 3.14); 
double result = e.evaluate(); 

Вариант 2: Вы можете использовать Java's script engine. Вы можете использовать его для вычисления выражений, определенных, например, в JavaScript:

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("js"); 
Object result = engine.eval("sin(1.25)"); 

Вариант 3: Compile в родную Java. При таком подходе вы используете шаблон для генерации .java-файла с классом, который содержит ваше выражение. Затем вы вызываете компилятор Java. Этот подход имеет недостаток, который имеет некоторую сложность в реализации и некоторую начальную задержку (до компиляции класса), но производительность является лучшей. Вот некоторые ссылки для изучения:

нотой Внимание Какой бы подход вы выбрали, иметь в виду, что вы должны думать о безопасности. Разрешение пользователю вводить код, который может быть оценен без ограничений безопасности, может быть очень опасным.

+0

Вы можете расширить вариант 3 с помощью генерации байт-кода - либо время компиляции (с некоторым плагином для сборки), либо во время выполнения. –

+0

Большое вам спасибо за помощь. Можете ли вы разместить ссылку на то, как я могу использовать третий вариант. Это кажется довольно интересным. – odermark

+1

@odermark, добавил ссылки на ответ. Я думаю, что первое должно дать вам хорошее начало. –

Смежные вопросы