2016-07-06 12 views
0

Ich las das Byte Kumpel und Javassist doc, und ich möchte nicht wissen, wenn möglich, ist eine Zeichenfolge wie zu konvertieren:Wie man dynamisch eingegebenen Benutzerausdruck in Java-Code konvertiert?

get foos where name == toto 

zu

data.getFoos().stream() 
       .filter(f -> f.name.equals("toto")) 
       .collect(Collectors.toSet()) 

Ein regex den Ausdruck erfassen, wie könnte:

final Pattern query = Pattern.compile("get (\\w+) where (\\w+) ([=!]+) (\\w+)"); 
final Scanner scanner = new Scanner(System.in); 
final Matcher matcher = query.matcher(input); 
matcher.group(1) // foos -> Foo and foos -> getFoos() 
matcher.group(2) // field to use as filter 
matcher.group(3) // symbol ==/!= 
matcher.group(4) // thing to match 
  1. convert get foos zu getFoos()
  2. Scheck von Foo Klasse, wenn name Feld name
  3. wenn Felder existiert keine Instanz von Number.class übersetzen ==-.equals
  4. den Ausdruck machen
  5. Schleife und Druckergebnisse

ich einige Beispiele lesen ohne in der Lage zu sein, eine solche Sache zu finden. Also komme ich hierher, um dein Licht zu bekommen. Danke

Antwort

1

Sowohl Byte Buddy und Javassist erzeugen Byte-Code, nicht Java-Code. Javassist hat jedoch die Funktionalität, String-enthaltenen Quellcode in Byte-Code von Ihren Eingaben zu übersetzen. Die Quellcodeebene ist jedoch auf Java 4-Ebene, sodass Sie keine Lambdas verwenden können.

Ich frage mich jedoch, ob dies der richtige Ansatz für Ihr Problem ist. Stattdessen würde ich vorschlagen, dass Sie einen Stream programmatisch aus den Argumenten auflösen. Sie können dies erweitern, indem Sie ein benutzerdefiniertes API erstellen, um Ihre Argumente in den betreffenden Stream zu transformieren.