Подтвердить что ты не робот

Запустить часть кода, содержащуюся в строке

У меня есть кусок кода Java в String.

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

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

4b9b3361

Ответ 1

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

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

Ответ 3

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

Отражение определенно не поможет, потому что отражение нацелено на классы ( "classfiles" ).

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

вы можете использовать этот код для запуска метода с помощью этого кода

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();
    }
}