0

Выполнение кода, содержащегося в строке

1

У меня есть фрагмент кода на Java, который хранится в строке.

String javaCode = "if(polishScreenHeight >= 200 && " +
                  "polishScreenHeight <= 235 && polishScreenWidth >= 220) { }";

Можно ли преобразовать эту строку в оператор Java и выполнить его? Возможно, с использованием рефлексии в Java?

5 ответ(ов)

0

Beanshell (как предложил Борис) — это способ "выполнения" исходного кода на Java. Но, похоже, вы хотите "выполнять" фрагменты, которые могут взаимодействовать с компилированными классами. Ваш пример содержит имена переменных.

Рефлексия определённо не поможет, потому что рефлексия ориентирована на классы ("файлы классов").

Вы могли бы попробовать определить полный класс ("действительный исходный файл Java"), скомпилировать его и загрузить (через URL ClassLoader). После этого вы сможете использовать методы из этого "сгенерированного класса". Однако, как только класс загружен, вы не сможете его удалить (разгрузить), поэтому это будет работать только один раз (насколько я знаю).

0

На сколько мне известно, нет простого способа сделать это.

Однако начиная с Java 6, вы можете компилировать исходный код для полных классов, используя javax.tools.Compiler. Скомпилированные классы затем могут быть загружены и выполнены. Но, боюсь, это не даст вам результата, который вы хотите.

0

Вы можете использовать следующий код для вызова метода с использованием класса Statement из пакета java.beans:

import java.beans.Statement;

public class HelloWorld {

  public void method_name(String name) {
      System.out.println(name);
  }

  public static void main(String[] args) throws Exception {
      HelloWorld h = new HelloWorld();
      new Statement(h, "method_name", new Object[]{"Hello world"}).execute();
  }
}

В этом примере создаётся объект класса HelloWorld, и затем вызывается метод method_name с аргументом "Hello world". Метод execute объекта Statement выполняет указанный метод на целевом объекте (h) с заданными параметрами. Убедитесь, что метод, который вы хотите вызвать, доступен и имеет соответствующий список параметров.

0

Ваш ответ на вопрос, связанный с использованием Java для выполнения JavaScript-кода, может выглядеть следующим образом:


  1. Пожалуйста, пересмотрите свой дизайн, это должно быть вашим последним вариантом.
  2. Необходимо проверить корректность строки, которая будет выполняться, чтобы избежать атак с инъекцией в будущем.

Если у вас есть возможность использовать строку в формате JavaScript, то приведенный ниже код может вам помочь:

public class EvalScript {

    public static void main(String[] args) throws Exception {
        // Создаем менеджер скриптовых движков
        ScriptEngineManager factory = new ScriptEngineManager();
        // Создаем JavaScript-движок
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        // Ниже JS функция выполняется.
        /*
         * Значение объекта student будет передано программой в формате JSON String.
        function checkStudentElgibility(student){
          if(student.age >= 10 && student.currentGrade >= 5){
            return true;
          }
        }
        // Значение объекта student будет передано программой в формате JSON String

        checkStudentElgibility(student);
        */

        String studentJsonString = "{\n" + 
                "  \"age\" : 10,\n" + 
                "  \"currentGrade\" : 5\n" + 
                "}";
        String javaScriptFunctionString = "function checkStudentElgibility(student){\n" + 
                "  if(student.age >= 10 && student.currentGrade >= 5){\n" + 
                "    return true;\n" + 
                "  }\n" + 
                "}\n" + 
                "checkStudentElgibility(student);";

        StringBuilder javaScriptString = new StringBuilder();
        javaScriptString.append("student=");
        javaScriptString.append(studentJsonString);
        javaScriptString.append("\n");
        javaScriptString.append(javaScriptFunctionString);

        Object object = engine.eval(javaScriptString.toString());

        System.out.println(object);

        // Вы также можете передать объект следующим образом,

        // выполняем JavaScript код, который определяет объект с одним методом
        engine.eval("var obj = new Object()");
        engine.eval("obj.hello = function(name) { print('Hello, ' + name) }");

        // Экспортируем объект, определенный в скрипте, в Java-приложение
        Object obj = engine.get("obj");

        // Создаем Invocable объект, приведя скриптовый движок к нужному типу
        Invocable inv = (Invocable) engine;

        // Вызываем метод с именем "hello" на объекте, определенном в JavaScript
        inv.invokeMethod(obj, "hello", "Script Method!");

        // Вы также можете использовать объекты Java как объекты JavaScript и передавать объекты в функции JavaScript

        String jsString = "var obj = new Object()\n" + 
                          "var ArrayList = Java.type(\"java.util.ArrayList\");\n" +
                          "var customSizeArrayList = new ArrayList(16);\n" + 
                          "obj.hello = function(name) { \n" + 
                          "   customSizeArrayList(name);  \n" + 
                          "   print('Hello, ' + name) \n" + 
                          "}";
    }

}

Источники: https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/javascript.html#A1147187


Если у вас есть дополнительные вопросы, не стесняйтесь задавать их!

0

Вы можете попробовать класс SimpleJavaSource из фреймворка JVx. В репозитории проекта есть тестовый пример, который содержит что-то похожее на следующее:

SimpleJavaSource js = new SimpleJavaSource();

js.executeScript("import java.lang.String;" +
        "strT = new String(\"true\");" +
        "strF = new String(\"false\");" +
        "System.out.println(1 == 1 ? strT : strF);" +
        "System.out.println(1 == 2 ? strT : strF);" +
        "if (1 == 2)" +
        "{" +
        "  System.out.println(\"equal\");" +
        "}" +
        "else" +
        "{" +
        "  System.out.println(\"different\");" +
        "}" +
        "if (1 == 1)" +
        "{" +
        "  System.out.println(\"equal\");" +
        "}" +
        "else" +
        "{" +
        "  System.out.println(\"different\");" +
        "}" +
        "i = 0;" +
        "while (i < 10)" +
        "{" +
        "  System.out.println(\"i=\" + i);" +
        "  i++;" +
        "}" +
        "i = 0;" +
        "do" +
        "{" +
        "  System.out.println(\"i=\" + i);" +
        "  i++;" +
        "}" +
        "while (i < 10);" +
        "for (int i = 0, size = 10; i < size; i++)" +
        "{" +
        "  System.out.println(\"i=\" + i);" +
        "}" +
        "System.out.println(\"END\");"
        );

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь