Как подставить символы типа String в выражение.
String s = "(";
String p = "+";
String so = ")";
int i = 1;
int j = 2;
int res;
// res = (1+2); Как мне получить такое выражение?
// может нужно использовать не String?
Создание строки выражения из данных
Для этого может воспользуемся экземляром класса StringBuilder
final String s = "(";
final String p = "+";
final String so = ")";
final int i = 1;
final int j = 2;
int res;
// res = (1+2); Как мне получить такое выражение?
// может нужно использовать не String?
final StringBuilder sb = new StringBuilder();
sb.append(s).append(i).append(p).append(j).append(so);
Далее понадобиться переменная для хранения строки выражения
// expressionString = (1+2)
final String expressionString = sb.toString();
Далее воспользуемся возможностями Java SE 1.6
final javax.script.ScriptEngineManager mgr = new javax.script.ScriptEngineManager();
final javax.script.ScriptEngine engine = mgr.getEngineByName("JavaScript");
try {
final Object resObj = engine.eval(expressionString);
res = ((Integer)resObj).intValue();
System.out.println(res);
} catch (javax.script.ScriptException e) {
e.printStackTrace();
}
Полный код примера:
public class Main {
public static void main(String[] args) {
String s = "(";
String p = "+";
String so = ")";
int i = 1;
int j = 2;
int res;
// res = (1+2); Как мне получить такое выражение?
// может нужно использовать не String?
StringBuilder sb = new StringBuilder();
sb.append(s).append(i).append(p).append(j).append(so);
final String expressionString = sb.toString();
final javax.script.ScriptEngineManager mgr = new javax.script.ScriptEngineManager();
final javax.script.ScriptEngine engine = mgr.getEngineByName("JavaScript");
try {
final Object resObj = engine.eval(expressionString);
res = ((Integer)resObj).intValue();
System.out.println(res);
} catch (javax.script.ScriptException e) {
e.printStackTrace();
}
}
}
Множество задач можно решить кодом на JavaScript, например:
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Test {
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
try {
Object result = engine.eval("1+2");
System.out.println(result);
} catch (ScriptException e) {}
}
}
Результат:
3
Что касается кода на java, насколько я знаю библиотека рефлексии не умеет выполнять не скомпилированный в байткод текст. Поэтому, если у программы во время выполнения есть доступ к javac, то вполне возможно вызвать компилятор из программы:
Runtime.getRuntime().exec("запускаемая_программа");
Cкомпилировать код как отдельный класс и вызывать его предварительно подключив:
Class c = Class.forName("Test");
Object obj = c.newInstance();
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости