web-dev-qa-db-de.com

Führen Sie ein Stück Code aus, das in einem String enthalten ist

Ich habe ein Stück Java-Code in einem String. 

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

Ist es möglich, diesen Java-String in eine Java-Anweisung zu konvertieren und auszuführen? Möglicherweise Java Reflection verwenden?

44
blue-sky

Wie bereits vorgeschlagen, können Sie Code mithilfe der Compiler-API im laufenden Betrieb kompilieren, speichern und ausführen.

Eine weitere nette Alternative wäre die Verwendung von beanshell . Beanshell ist nicht mehr aktiv entwickelt, aber ich kann für seine Zuverlässigkeit bürgen, ich habe sie in mehreren Produktionsprojekten erfolgreich eingesetzt.

22
Joel

BeanShell verwenden. Es gibt eine Seite über wie man sie von Java aus benutzt .

9
Boris Pavlović

Beanshell (wie Boris vorgeschlagen hat) ist eine Möglichkeit, Java Quellcode "auszuführen". Aber es sieht so aus, als ob Sie Fragmente "ausführen" möchten, die mit den kompilierten Klassen interagieren können. Ihr Beispiel enthält Variablennamen.

Reflexion wird definitiv nicht helfen, weil Reflexion auf Klassen abzielt ("Klassendateien").

Sie könnten versuchen, eine vollständige Klasse zu definieren ("gültige Java Quelldatei"), kompilieren und laden (url classloader). Dann sollten Sie in der Lage sein, die Methoden dieser "live generierten Klasse" zu verwenden. Sobald eine Klasse geladen ist, können Sie sie nicht mehr entfernen (entladen). Dies funktioniert also nur einmal (AFAIK).

2
Andreas_D

Eine andere Möglichkeit wäre, Ihren Code als Groovy-Code auszuführen, siehe this für ein Beispiel.

1
pgras

Meines Wissens gibt es keine einfache Möglichkeit, dies zu tun. 

In Java 6 und darüber hinaus können Sie can Quellcode für vollständige Klassen mithilfe von javax.tools.Compiler kompilieren. Die kompilierten Klassen können dann geladen und ausgeführt werden. Aber ich glaube nicht, dass das erreicht wird, was Sie wollen.

1
Steve McLeod

sie können diesen Code verwenden, um die Methode mit diesem Code auszuführen 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
Lasitha Lakmal

Es ist nicht Java, aber als pgras hat bereits vorgeschlagen, dass Sie GrooyScript wie folgt verwenden könnten:

    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
Jonas_Hess

Probieren Sie die JavaCompiler API aus.

Jemand anderes hat jedoch auf diese Weise besser geantwortet, als ich könnte: Konvertieren Sie String in Code

Seien Sie vorsichtig, bevor Sie so etwas verwenden ...

0
Mike