Запустить фрагмент кода, содержащийся в строке - PullRequest
44 голосов
/ 08 декабря 2010

У меня есть фрагмент кода Java в строке.

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

Можно ли преобразовать эту строку Java в инструкцию Java и запустить ее? Возможно, с помощью отражения Java?

Ответы [ 8 ]

22 голосов
/ 08 декабря 2010

Как уже было предложено, вы можете компилировать, сохранять и запускать код на лету, используя API компилятора .

Еще одна изящная альтернатива - использовать beanshell ,Beanshell более активно не разрабатывается, но я могу ручаться за его надежность, я успешно использовал его в нескольких производственных проектах.

9 голосов
/ 08 декабря 2010
2 голосов
/ 08 декабря 2010

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

Отражение определенно не поможет, потому что отражение предназначается для классов («классов»).

Вы можете попытаться определить полный класс ("действительный исходный файл Java"), скомпилировать его и загрузить (url classloader). Тогда вы сможете использовать методы этого «живого сгенерированного класса». Но как только класс загружен, вы не можете избавиться от него (выгрузить), поэтому это будет работать только один раз (AFAIK).

1 голос
/ 07 января 2015

вы можете использовать этот код для запуска метода с использованием этого кода new Statement(Object target, String methodName, Object[] arguments).execute();

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();
  }
 }
1 голос
/ 08 декабря 2010

Другим способом было бы выполнить ваш код как код Groovy, см. this для примера.

1 голос
/ 08 декабря 2010

Насколько я знаю, не существует простого способа сделать это.

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

0 голосов
/ 28 августа 2018

Это не Java, но, как уже pgras предлагает использовать GrooyScript, вот так:

    Binding binding = new Binding();
    GroovyShell shell = new GroovyShell(binding);

    String[] strings = new String[]{"World", "Groovy"};
    shell.setVariable("args", strings);

    String script = "return \"Hello \" + args[1]";
    String value = (String) shell.evaluate(script);
    System.out.println(value); // Hello Groovy
0 голосов
/ 08 декабря 2010

Попробуйте API JavaCompiler .

Кто-то ответил так лучше, чем я, хотя: Преобразовать строку в код

Будьте осторожны, прежде чем использовать что-то подобное ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...