Как подставить символы типа String в выражение?

200
26 ноября 2016, 19:12

Как подставить символы типа String в выражение.

 String s = "(";
 String p = "+";
 String so = ")";
 int i = 1;
 int j = 2;
 int res;
 // res = (1+2); Как мне получить такое выражение? 
 // может нужно использовать не String?
Answer 1

Создание строки выражения из данных

  • Для этого может воспользуемся экземляром класса 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();
        }
    }
}
Answer 2

Множество задач можно решить кодом на 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();     
READ ALSO
Где лучше создавать Retrofit клиент?

Где лучше создавать Retrofit клиент?

Я обычно создавала Retrofit клиент в классе App в onCreate(), но услышала мнение, что это неправильно, так как по сути получается, что это не СинглтонГде...

327
Абстрактный класс BaseActivity

Абстрактный класс BaseActivity

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

204
NavigationDrawer и клавиатура

NavigationDrawer и клавиатура

Во время нажатия на EditText появляется клавиатура, но когда открываем NavigationDrawer то она никуда не пропадает и даже если перейдем на другой фрагмент...

303
Как вывести часть текста из файла?

Как вывести часть текста из файла?

Есть текставик содержащий луа скрипты и ненужный мусорНужно выводить куски текста скажем от "local" до "}" по нажатию кнопки

220