Как подставить символы типа 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();
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я обычно создавала Retrofit клиент в классе App в onCreate(), но услышала мнение, что это неправильно, так как по сути получается, что это не СинглтонГде...
Я хочу создать абстрактный класс BaseActivity, от которого бы наследовались остальные Activity в проекте, во всех классах Activity у меня сейчас используется...
Во время нажатия на EditText появляется клавиатура, но когда открываем NavigationDrawer то она никуда не пропадает и даже если перейдем на другой фрагмент...
Есть текставик содержащий луа скрипты и ненужный мусорНужно выводить куски текста скажем от "local" до "}" по нажатию кнопки