3 Stimmen

Kann eine Zeichenkette in eine Anweisung umgewandelt werden?

Dieser Code in Java:

for (Integer x=1; x <= 3; x++) {
    y = "array[" + Integer.toString(x) + "] = a" + Integer.toString(x) + ".getText();";
    System.out.println(y);
    }

druckt aus:

array[1] = a1.getText();
array[2] = a2.getText();
array[3] = a3.getText();

Ich möchte jedoch nicht, dass die Zeichenfolge y ausgedruckt wird, sondern dass sie ausgeführt wird. Wie kann ich dies in Java tun?

Wenn dies nicht möglich ist, gibt es einen anderen Weg, um das zu erreichen, was ich will, abgesehen von den 3 Anweisungen?

array[1] = a1.getText();
array[2] = a2.getText();
array[3] = a3.getText();

Der Einfachheit halber habe ich 3 verwendet, obwohl ich 20 Anweisungen benötige. Noch wichtiger ist, dass ich versuche, mehr über Java zu lernen und nach einer eleganteren Lösung suche.

1voto

Kevin Peterson Punkte 7069

Was Sie suchen, ist "eval" in vielen interpretierten Sprachen. Java erlaubt es nicht, Quellcode zur Laufzeit zu evaluieren. Das liegt daran, dass es sich um eine kompilierte und nicht um eine interpretierte Sprache handelt.

Sie können einige der Funktionen durch Reflection oder Bytecode-Generierung erhalten, aber dies sind fortgeschrittene Funktionen, die in der Regel von Entwicklern von Frameworks oder Bibliotheken verwendet werden, und kein Routinebestandteil der täglichen Programmierung.

1voto

Patricia Shanahan Punkte 25223

Obwohl Java selbst keine Skriptsprache ist, verfügt es über eine Bibliothek, javax.script, die Skripts mit einer eval-Methode unterstützt. Ich habe sie verwendet, wenn ich einen Ausdruck als Eingabeparameter für ein Programm zulassen wollte.

0voto

Arpit Punkte 12689

Eine einfache Schleife kann Ihre Arbeit erledigen:

for(int i=0;i<array.length;i++){
array[i] = a[i].getText();
}

0voto

toddkaufmann Punkte 315

Auswahlmöglichkeiten:

  1. können Sie den Java-Compiler von Java aus aufrufen, eine Klasse erstellen und diese dynamisch aufrufen. Das ist zu viel Aufwand für ein paar Zeilen Snippet.

  2. Wenn Ihre "20 Anweisungen" alle eine ähnliche Form haben und Sie über ein begrenztes Vokabular verfügen, können Sie Ihren eigenen "Anweisungssatz" erstellen und diesen mit einer Dispatch-Funktion abfragen. (Dies ist eine generische Lösung für jede Sprache.)

  3. Wenn Sie mit mächtigeren Sprachen wie Lisp vertraut sind, haben einige der verfügbaren Skriptsprachen für Java auch eine eval-Funktion.

Ich mag Groovy, weil es das Beste aus beiden Welten: dynamische und funktionale Nutzung, Schließungen, interaktive, explorative (zB Tab-Vervollständigung auf vars und Methoden), und ist ein Superset der Java-Sprache und kann alle Ihre bestehenden Java-Klassen und Jars verwenden. Es ist einfach, eine Groovy-Konsole einzubetten, die sich (sogar von Ihrem Server aus) öffnet und in der Sie interaktiv herumstöbern, Werte untersuchen usw.

Unten sehen Sie ein Beispiel für die Auswertung des Codes aus der Groovy-Shell; der Aufruf aus Java ist praktisch identisch; siehe http://groovy.codehaus.org/Embedding+Groovy

$ groovysh
Groovy Shell (1.8.4, JVM: 1.6.0_24)
Type 'help' or '\h' for help.
---------------------------------------------------------------------------------------------
groovy:000> class Athing {  String name; public Athing(String name){ this.name=name; }; String getText() { return name + "'s getText() returns..."; }; }
===> true
groovy:000> a1 = new Athing("a1"); a2 = new Athing("a-two");  a3 = new Athing("A_3"); 
===> Athing@6e7616ad
groovy:000> a1.getText()        // showing 
===> a1's getText() returns...
groovy:000> b = new Binding();
===> groovy.lang.Binding@2c704cf5
groovy:000> array = [ 'not','set','yet' ]   // create an array for return values
===> [not, set, yet]
groovy:000> b.setVariable( "a1", a1 ); b.setVariable( "a2", a2 ); b.setVariable( "a3", a3 ); b.setVariable( "array", array );
===> null
groovy:000> shell = new GroovyShell(binding);
===> groovy.lang.GroovyShell@24fe2558
groovy:000> code = "array[1] = a1.getText();\n" + "array[2] = a2.getText();\n" + "array[3] = a3.getText();\n";
===> array[1] = a1.getText();
array[2] = a2.getText();
array[3] = a3.getText();

groovy:000> array                        // value of array before
===> [not, set, yet]
groovy:000> shell.evaluate( code );      // evaluate the string of code we were given
===> A_3's getText() returns...
groovy:000> array
===> [not, a1's getText() returns..., a-two's getText() returns..., A_3's getText() returns...]
groovy:000>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X