# Java Interpreter



## martin82 (26. Aug 2009)

Hi,

bin auf der Suche nach einem Java Interpreter. Ich bekomme einen String mit Java-Code übergeben und muss diesen ausführen und ein evt. Ergebnis zurückgeben. Wie kann ich da am Besten vorgehen bzw. welches Tool verwenden?

lg


----------



## Leroy42 (26. Aug 2009)

martin82 hat gesagt.:


> Ich bekomme einen String mit Java-Code übergeben und muss diesen ausführen und ein evt. Ergebnis zurückgeben.



Wie komplex kann dieser Java-Code denn werden?

Sollen auch JNI-Aufrufe ausgeführt werden können?


----------



## martin82 (26. Aug 2009)

Nein.

Nur einfache getter-Methoden eines Objekts.


----------



## Leroy42 (26. Aug 2009)

Also als Java-Interpreter würde ich mal *javac* vorschlagen.

Erhältlich in jedem gut sortierten Java Runtime Environment!

(und das sogar kostenlos)


----------



## HoaX (26. Aug 2009)

Ansonsten sei noch BeanShell und Groovy erwähnt. Kommen beide mit der Javasyntax zurecht.


----------



## HoaX (26. Aug 2009)

Leroy42 hat gesagt.:


> Also als Java-Interpreter würde ich mal *javac* vorschlagen.
> 
> Erhältlich in jedem gut sortierten Java Runtime Environment!
> 
> (und das sogar kostenlos)



Du meinst Development Kit!


----------



## 0x7F800000 (26. Aug 2009)

hier hat Ariol sowas mal gebastelt: http://www.java-forum.org/codeschnipsel-u-projekte/61076-code-zur-laufzeit-generieren.html

Wozu soll das ganze eigentlich gut sein? Oder ist's betriebsgeheimnis?


----------



## Spacerat (26. Aug 2009)

Leroy42 hat gesagt.:


> Also als Java-Interpreter würde ich mal *javac* vorschlagen.
> 
> Erhältlich in jedem gut sortierten Java Runtime Environment!
> 
> (und das sogar kostenlos)


[KORINTENKACK]Wohl kaum... Java Runtime Environment == JRE; javac.exe gibts nur im JDK oder besser im Java Development Kit, neuerdings auch Java2-SDK genannt.[/KORINTENKACK]
@Edit: mist... zu langsam...


----------



## Leroy42 (26. Aug 2009)

HoaX hat gesagt.:


> Du meinst Development Kit!



???:L

Sorry, ihr habt Recht!

Ich meinte natürlich *java*


----------



## martin82 (27. Aug 2009)

0x7F800000 hat gesagt.:


> Wozu soll das ganze eigentlich gut sein? Oder ist's betriebsgeheimnis?



Das soll verwendet werden um Etiketten für unser Produkt dynamisch zu drucken. Die Definitions-Dateien sollen dabei außerhalb der jar liegen um nicht bei jeder Änderung das Programm neu kompilieren zu müssen.

Hier nochmal eine genauer Beschreibung des Problems:
Wie kann ich den Javacode der sich in einer Textdatei (beispielsweise "testcode.txt") an einer bestimmten stelle in meinem Programm ausführen? (Der Code soll so ausgeführt werden als wenn er da drin stünde - sprich der code soll auf alle Variablen im Programm zugreifen können und Methoden ausführen.


----------



## HoaX (27. Aug 2009)

Also einfach Code einschleusen als stünde er in der Methode wirst du so nicht hinbekommen. Aber du kannst die durch die gegebenen Vorschläge neue Objekte mit definiertem Interface erstellen. Dann kannst du einheitlich die evtl. benötigten Daten aus dem Hauptprogramm mit übergeben und als Resultat gekommst du dein Etikett zurück.

Wenn dein Etikett nur Text enthält so würde ich da wohl Groovy und dessen TemplateEngine dafür benutzen: Groovy - Groovy Templates


----------



## Painii (27. Aug 2009)

martin82 hat gesagt.:


> Wie kann ich den Javacode der sich in einer Textdatei (beispielsweise "testcode.txt") an einer bestimmten stelle in meinem Programm ausführen? (Der Code soll so ausgeführt werden als wenn er da drin stünde - sprich der code soll auf alle Variablen im Programm zugreifen können und Methoden ausführen.



Wie wäre es das ganze, wenn es sowieso schon java-code ist, auch als java auszuführen? :autsch:

Sprich eine Methode, die die benötigten Variablen bekommt und dann damit arbeiten kann.


----------



## 0x7F800000 (27. Aug 2009)

martin82 hat gesagt.:


> Das soll verwendet werden um Etiketten für unser Produkt dynamisch zu drucken. Die Definitions-Dateien sollen dabei außerhalb der jar liegen um nicht bei jeder Änderung das Programm neu kompilieren zu müssen.


Wie um himmels willen habt ihr "Etiketten" von was auch immer in Form einer java Datei abgespeichert? ???:L Unter etikette stelle ich mir eher sowas wie ein Bild mit n bisschen text vor? :autsch:


> Wie kann ich den Javacode der sich in einer Textdatei (beispielsweise "testcode.txt") an einer bestimmten stelle in meinem Programm ausführen? (Der Code soll so ausgeführt werden als wenn er da drin stünde - sprich der code soll auf alle Variablen im Programm zugreifen können und Methoden ausführen.


gar nicht.


----------



## Spacerat (27. Aug 2009)

..geht nicht ist immer schnell gesagt aber gerade im Bereich Softwareentwicklung in den seltensten Fällen auch zutreffend.
Hier z.B. werden Klassen mit einem speziellen ClassLoader sozusagen "on demand" kompiliert.


----------



## 0x7F800000 (27. Aug 2009)

Spacerat hat gesagt.:


> ..geht nicht ist immer schnell gesagt aber gerade im Bereich Softwareentwicklung in den seltensten Fällen auch zutreffend.


Ich habe gehofft, mit meiner etwas pauschalisierten Aussage den OP von seiner idee, einen Nagel in eine Betonmauer mit einer Porzellantasse zu hauen, abzubringen.

Du erzählst stattdessen, wie man Tassen aus Karbonfaserverstärkten metallischen Gläsern herstellt, statt auf einen einfachen hammer hinzuweisen


----------



## Spacerat (27. Aug 2009)

0x7F800000 hat gesagt.:


> Du erzählst stattdessen, wie man Tassen aus Karbonfaserverstärkten metallischen Gläsern herstellt.


So ist das eben... Wozu braucht man Transistoren? Es gibt doch Röhren...
Der TS wollte schlicht Javacode zur Laufzeit interpretieren. Hätte niemand gefragt wieso oder hätte er es uns nicht erzählt, wäre uns der Umstand, dass er etwas viel zu umständlich machen würde, gar nicht bekannt. Ich finde es ohnehin vermessen, den Fragenden ständig nach den Hintergründen seines Vorhabens auszufragen, nur um festzustellen dass es einen Weg gibt, der dann mit der Fragestellung nichts mehr zu tun hat. Wenn dann ein anderer mit der Suchfunktion in diesem Thread landet, liest er 20 Beiträge in denen es um die Möglichkeit einer anderen Lösung geht und findet auf der Letzten Seite dann eben auch eine für ein ganz anderes Problem, jedoch nicht für das gesuchte. Ganz schön frustrierend...


----------



## martin82 (28. Aug 2009)

0x7F800000 hat gesagt.:


> Wie um himmels willen habt ihr "Etiketten" von was auch immer in Form einer java Datei abgespeichert? ???:L Unter etikette stelle ich mir eher sowas wie ein Bild mit n bisschen text vor? :autsch:
> 
> gar nicht.



Die sind nicht in einer java-Datei gespeichert. Es sind einfache Textdateien mit Befehlen für den Etikettendrucker und eben Java-Code um Werte dynamisch zu übergeben. Eine Zeile sieht dann zum Beispiel so aus:"#G#B3J#X50#Y120#${artikel.getNumber()}$"

Doch es geht. Mit dem hier zB: DynamicJava
Nur mittlerweile halt viel zu langsam.



Der Vorschlag mit Groovy gefällt mir gut. Als wir das Problem damals gelöst haben gabs kein Groovy.


----------



## Spacerat (28. Aug 2009)

Jetzt hänge ich zwar Poster mit einem Bolzenschussgerät auf... aber wie wäre es mit einem Servlet-Container wie z.B. Tomcat?


----------



## martin82 (28. Aug 2009)

Wie genau würdest du das realisieren? Hab nicht viel Erfahrung mit dieser Materie...


----------



## 0x7F800000 (28. Aug 2009)

Spacerat hat gesagt.:


> Jetzt hänge ich zwar Poster mit einem Bolzenschussgerät auf... aber wie wäre es mit einem Servlet-Container wie z.B. Tomcat?


Hat man einen Bolzenschussgerät, so sieht jedes Problem wie eine Webapplikation aus? ???:L



martin82 hat gesagt.:


> Die sind nicht in einer java-Datei gespeichert. Es sind einfache Textdateien mit Befehlen für den Etikettendrucker und eben Java-Code um Werte dynamisch zu übergeben. Eine Zeile sieht dann zum Beispiel so aus:"#G#B3J#X50#Y120#${artikel.getNumber()}$"


:autsch:

Dann hör endlich auf zu versuchen diesen unsinn in ein Java-Programm reinzubekommen, sondern überlege dir lieber, wie du den Java-Code aus diesen Textdateien rausbekommst. Bisher bist du auf dem besten Wege, eine der abartigst komplizierten und absolut nicht recyclebaren Lösungen für ein beinahe triviales problem zu fabrizieren. Um eine Textdatei einzulesen, da einmal mit regex drüberzugehen und irgendwelche tags mit paar Zahlen zu ersetzen braucht man 4-5 Zeilen, aber sicher kein Java-code in Etiketten und keine eigenbau-classloader und keine tomcats und keine karbonfaserbrüblabla...


----------



## Dissi (28. Aug 2009)

Ich hab mir das gerade nich alles durchgelesen aber habe das Stichwort "Groovy" aufgeschnappt.

Groovy bietet eine "Eval" Klasse an, welche String Interpretiert.

Das Funktioniert dann ala:


```
String code = "println 'test' " //println --> äquivalent zu System.out.println()
Eval.me(code)
```

Eval (Groovy 1.6.4)

MFG


----------



## Leroy42 (28. Aug 2009)

0x7F800000 hat gesagt.:


> Dann hör endlich auf zu versuchen diesen unsinn in ein Java-Programm reinzubekommen, sondern überlege dir lieber, wie du den Java-Code aus diesen Textdateien rausbekommst. Bisher bist du auf dem besten Wege, eine der abartigst komplizierten und absolut nicht recyclebaren Lösungen für ein beinahe triviales problem zu fabrizieren. Um eine Textdatei einzulesen, da einmal mit regex drüberzugehen und irgendwelche tags mit paar Zahlen zu ersetzen braucht man 4-5 Zeilen, aber sicher kein Java-code in Etiketten und keine eigenbau-classloader und keine tomcats und keine karbonfaserbrüblabla...



:applaus::applaus::applaus:


----------



## Spacerat (29. Aug 2009)

martin82 hat gesagt.:


> Wie genau würdest du das realisieren? Hab nicht viel Erfahrung mit dieser Materie...


Na ja... Die Beispielzeile sieht den JSPs, wie sie in solchen Containern verwendet werden, recht ähnlich. deswegen hab' ich das mal so in den Raum gestellt. Das Problem dabei wäre, dass die Datei nicht über das Dateisystem sondern über einen Server per HTTP-Protokoll angesprochen wird. Deswegen könnte es durchaus sein, das es auch nicht die Lösung ist.
Auf jeden Fall ist das Beispiel kein reiner Java-Code und kann deswegen wohl auch kaum kompiliert werden. Es wird also etwas benötigt, dass irgendetwas interpretiert und ggf. vorhandene Java-Methoden ausführen kann.
An diesem Punkt muss man sich klar machen, dass meine Mithelfer durchaus recht haben, wenn sie sagen, such dir 'ne bessere Möglichkeit. In diesem speziellen Fall würde ich z.B. auf XML mit XSL plädieren.
Um die Frage nach der Realisierung zu beantworten, bräuchte ich zunächst eie Beschreibung, wie so ein Druckvorgang bisher aussieht und vor allem, aus welcher Software wird gedruckt. Ist es eine Java-Anwendung? Ist dafür der Quellcode (speziell die Druckfunktion) vorhaden?


----------



## gizmo (29. Aug 2009)

Wenn es darum geht, in der Textdatei einige Werte durch Werte von übergebenen Objekten zu ersetzen, kannst du Velocity verwenden: Apache Velocity - Velocity


----------



## 0x7F800000 (29. Aug 2009)

Spacerat hat gesagt.:


> Na ja... Die Beispielzeile sieht den JSPs, wie sie in solchen Containern verwendet werden, recht ähnlich. deswegen hab' ich das mal so in den Raum gestellt. Das Problem dabei wäre, dass die Datei nicht über das Dateisystem sondern über einen Server per HTTP-Protokoll angesprochen wird. Deswegen könnte es durchaus sein, das es auch nicht die Lösung ist.


Sichere Anzeichen dafür, dass die Programmierer in ihrem Unternehmen zu viel Zeit haben: sie bauen Webapplikationen für einen Java Enterprise Server in Etikettiermaschinen ein 


> In diesem speziellen Fall würde ich z.B. auf XML mit XSL plädieren.


Das hört sich schon um 5 Größenordnungen vernünftiger an  , obwohl evtl. immer noch overkill.

Ihr habt doch gesehen: es geht lediglich darum, eine Artikelnummer in eine Textdatei einzusetzen, der OP will nicht mit einer Webapplikation zum Mond fliegen ;(

Andererseits: mir egal. Solange diese Etikettiermaschine keine Intelligenz entwickelt und die Weltherrschaft übernimmt, ist mir alles recht


----------

