web-dev-qa-db-fra.com

Exécuter un morceau de code contenu dans une chaîne

J'ai un morceau de code Java dans une chaîne. 

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

Est-il possible de convertir cette chaîne Java en une instruction Java et de l'exécuter? Peut-être en utilisant la réflexion Java?

44
blue-sky

Comme cela a déjà été suggéré, vous pouvez compiler, enregistrer et exécuter du code à la volée à l'aide de l'API Compiler .

Une autre alternative intéressante consisterait à utiliser beanshell . Beanshell n'est plus activement développé, mais je peux en garantir la fiabilité, je l'ai utilisé avec succès dans plusieurs projets de production.

22
Joel

Utilisez BeanShell. Il y a une page sur comment l'utiliser depuis Java .

9
Boris Pavlović

Beanshell (comme suggéré par Boris) est un moyen "d'exécuter" le code source Java. Mais il semble que vous souhaitiez "exécuter" des fragments pouvant interagir avec les classes compilées. Votre exemple contient des noms de variable.

La réflexion ne va certainement pas aider, car la réflexion cible les classes ("classfiles").

Vous pourriez essayer de définir une classe complète ("fichier source Java valide"), de la compiler et de la charger (chargeur de classe url). Ensuite, vous devriez pouvoir utiliser les méthodes de cette "classe générée en direct". Mais une fois qu'une classe est chargée, vous ne pouvez pas vous en débarrasser (décharger), donc cela ne fonctionnera qu'une fois (autant que je sache).

2
Andreas_D

Une autre façon serait d'exécuter votre code en tant que code Groovy, voir this pour un exemple.

1
pgras

Autant que je sache, il n'y a pas de moyen simple de le faire. 

Cependant, à partir de Java 6, vous pouvez pouvez compiler le code source pour des classes complètes à l'aide de javax.tools.Compiler. Les classes compilées peuvent ensuite être chargées et exécutées. Mais je ne pense pas que cela donnera ce que vous voulez.

1
Steve McLeod

vous pouvez utiliser ce code pour exécuter une méthode en utilisant ce code 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

Ce n'est pas Java, mais comme pgras a déjà suggéré d'utiliser GrooyScript comme suit:

    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

Essayez l'API JavaCompiler .

Quelqu'un d'autre répondit mieux que moi de cette façon: cependant: Convertir une chaîne en code

Soyez prudent avant d'utiliser réellement quelque chose comme ça ...

0
Mike