Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: Php-eval() unter Java?

  1. #1
    Registrierter Benutzer
    Registriert seit
    19.07.2004
    Beiträge
    50

    Php-eval() unter Java?

    Hi,

    ich meine mal gehört zu haben, dass es unter Java auch ne Möglichkeit gibt, dynamisch Java-Code auszuführen, weiß zufällig jemand wie die Klasse heißt, oder wonach ich suchen könnte? Der Benutzer soll also zum Beispiel "System.out.println('Hallo');" in ein Textfeld eingeben und dann soll "Hallo" ausgegeben werden.

    Danke im Voraus.

  2. #2
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Nööö....

    Beanshell dürfte genau das sein, was du suchst, interpretiert ziemlich gut Java-Code, ist halt ca. 1/1000 von der Geschwindigkeit von Java, kommt halt drauf an, ob dein code eher api lastig ist, oder ob du viel selbst machst.
    Für code der nur wneige male durchlaufen wird reichts vollkommen (z.B. erstellen von Oberfächen), für Harte Mathe-Sachen würd ich eher davon abraten ;-)
    Geändert von Lin728 (21-08-2017 um 15:10 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.02.2002
    Beiträge
    41
    Klar geht das.
    Man kann doch über die Reflection API[1] Methoden aufrufen, die erst während der Laufzeit bekannt werden.
    Man müsste dann nur die Eingabezeile entsprechend parsen.
    Da muss man allerdings den Typ des Parameters angeben. Das heisst, es muss während der Eingabe auch angegeben werden, von welchem Typ die Parameter sind, oder halt nur eine bestimmte Menge an Methode erlauben, die eingegeben werden dürfen und dazu die Parametertypen irgendwio ablegen.
    Das währe jetzt die einzige Möglichkeit, die mir so spontan einfällt. Wüsste aber auch nicht, wie es anders gehen sollte.

    Da ist auch nichts statisch, man kann dynamisch irgendwelche Objekte erzeugen, deren Typ oder Name während der Programmierung nicht bekannt ist. Geht alles über die Reflection API. Ist ne ganz interessante Sache.


    Gruss
    Sebastian

    [1] http://java.sun.com/docs/books/tutor...ct/invoke.html

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    Wirklich?

    Java ist eine statisch getypte Sprache - niemand hat was anderes gesagt. Bei reflection gibts sowieso nur Typprüfung zur Laufzeit.
    Geändert von Lin728 (21-08-2017 um 15:10 Uhr)

  5. #5
    Registrierter Benutzer Avatar von fs111
    Registriert seit
    23.03.2002
    Beiträge
    594
    Könnt ihr bitte mal locker bleiben?

    Danke

    fs111

  6. #6
    Registrierter Benutzer
    Registriert seit
    16.09.2001
    Beiträge
    1.182

    ;-)

    ......................
    Geändert von Lin728 (21-08-2017 um 15:11 Uhr)

  7. #7
    hbdsklf
    Gast

    Eigener Classloader

    Wenn du einen eigenen Classloader schreibst solltest du eigentlich code zur laufzeit ausführen können, sofern es sich um eine ganze klasse handelt. Ich hab mir so ein Plugin-System gebastelt und ich kann Plugins während der Laufzeit hinzuladen...

  8. #8
    Registrierter Benutzer
    Registriert seit
    12.12.2007
    Beiträge
    15
    Zitat Zitat von ceisserer
    1.) Wirklich - es gibt in Java eine reflektion API? - Das ist ja der hammer!
    2.) Ahh, die Reflection-API ist also ein interpreter, wie im Post gefragt?
    3.) Java ist eine statisch getypte Sprache - niemand hat was anderes gesagt. Bei reflection gibts sowieso nur Typprüfung zur Laufzeit.
    Zu 1
    Ja, die gibts. :-)

    Zu 2
    Wo wird im Post nach einem Interpreter gefragt? Es wird lediglich gesagt, in welcher Richtung er etwas sucht, aber nicht, dass es ein Interpreter sein muss.


    Das ganze lässt sich mit der Reflection-Api lösen, aber es ist schon aufwendig.
    Wenn ich frage darf, warum möchtest du das machen?

    MFG

    zEriX

  9. #9
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Wie wärs mit der in Java 6 enthaltenen Scriptingengine?

    PHP ist eine Skriptsprache und php-eval() führ zur Laufzeit ein Skript aus. Also ist genau dies möglich mit der Scriptingengine aus Java 6. Als Scriptsprache könnte z.B. Groovy herhalten, da kannst du sogar so etwas System.out.println hineinschreiben.

    Mit Reflection kannst du das vergessen, dass müsste ja heissen, man müsste einen Compiler einbauen oder irgendwie so. That goes not.
    Plugins sind nicht das gleiche.

    Z.B.:

    Code:
    test.groovy:
    println "message from outer space"
    
    call.groovy:
    engine = new GroovyScriptEngine(".")
    engine.run("test.groovy", new Binding())
    
    Ausgabe:
    message from outer space
    Dass man hier dynamisch ein Groovy-Skript schreiben kann und dieses dann der run-Methode übergeben, kommt dem ganzen schon sehr nahe. Man kann natürlich seine eigene ScriptEngine schreiben, die das dann kapselt, womit man dann wirklich schon sehr nahe php-eval herankommt. Dann glaube ich, kann man Groovy-Code irgendwie in Java-Code umwandeln, ob der umgekehrte Weg geht, weiß ich nicht, aber dann ist da ja ohnehin noch mehr möglich. Aber DAS ist für mich der richtige Ansatz.

    mfg, Christian

    Edit: Der Überhammer: Hab grad noch mal nachgelesen und die Methode aus dem Interface Scriptengine heißt sogar eval http://java.sun.com/javase/6/docs/ap...iptEngine.html.

    Lesen bildet

    Edit: Einen Link hab ich noch: https://scripting.dev.java.net/. Da wird sogar Java als Skipt-Sprache aufgeführt. Sollte man mal genauer unter die Lupe nehmen.
    Geändert von Waxolunist (12-12-2007 um 16:40 Uhr)
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  10. #10
    Registrierter Benutzer
    Registriert seit
    12.12.2007
    Beiträge
    15
    Sicher kann man das mit Reflection machen.

    Zum Beispiel bei
    Code:
    System.out.println("test")
    kennst du die Klassen, Objecte, Methoden. Du kannst den String splitten. Du kannst dann die Klasse laden. Dann kann man das Feld der Klasse holen und die Methode darauf ausführen.
    Man muss es ja nicht so machen, dass der Code neu kompiliert wird, sondern man kann die Klassen einfach dynamisch laden und die Methoden ausführen. Aber wie ich schon sagte, es ist schon ziemlich aufwendig.

    Meiner Meinung nach ist es das gleiche Ergebnis, weil der Code ausgeführt wird, den der Nutzer eingegeben hat.

    Ok, was natürlich nicht funktioniert ist es, wenn man eine neue Klasse schreiben möchte.

    MFG

    zEriX
    Geändert von zerix (13-12-2007 um 07:16 Uhr)

  11. #11
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Und wie machst du das mit if-Schleifen?
    Wie machst du das mit Primitiven?
    Schlüsselwörter?
    Du merkst hoffentlich schon, dass das alles nicht wirklich geht.

    Allerdings fände ich es schon toll, wenn du mir, dass nur mit System.out.println zeigst.
    Und im gleichen Code mit einem kleinen new Irgendwas.

    Du musst unterscheiden zwischen Konstanten und Klassen neu zu erzeugen. Nur um mal schnell ein Problem zu nennen. Dazu irgendwie Variablen verarbeiten.

    Also kurzes Beispiel (Bitte mit Reflection programmieren):
    Code:
    for(int i=0; i<10; System.out.println(Math.sqrt(i++)));
    Scheiterpunkt 1: Du musst das Schlüsselwort for kennen und irgendwie abbilden.
    2: Du musst Variablen kennen und parsen.
    3: Du musst die Klasse Math finden, ohne den Paketnamen.
    4: ...

    Zudem ist dieser Rat, doch irgendwie trotzdem völlig aus der Luft gegriffen. Gefragt wurde nach einem Equivalent für eval und es gibt eine Methode eval in Java. Ein Rat, programmiers doch selbst mit Reflection, ist relativ unsinnig, was du bemerken wirst, sobald du selbst einmal das programmieren musst, was du vorgeschlagen hast.

    @KL47: Bitte nimm keine Reflection.

    lg, Christian
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  12. #12
    chris2000
    Gast
    Hallo

    Ich nehe für diesen Zweck die Beanshell: http://www.beanshell.org/ die kann man prima in die eigene App mit einbauen und dynamsich Java Code ausführen.

    SG
    Christian

  13. #13
    Registrierter Benutzer
    Registriert seit
    12.12.2007
    Beiträge
    15
    @Waxolunist

    Ein Kollege von mir hat sowas in der Art, also nicht das gleiche, aber was man theoretisch dafür verwenden könnte, geschrieben. Er nutzt natürlich nicht ausschließlich Reflection, aber Reflection kommt auch zum Zuge.

    Da ich den Code nicht kenne, kann ich auch nicht sagen, wie er es gemacht hat.

    Da wir mit Java 5 arbeiten, kommt der Scriptanteil ja nicht in Frage.

    Ich würde es nicht behaupten, wenn ich nicht wüsste, dass es funktioniert. Also ist mein Rat so wie du es formuliert hast, nicht aus der Luft gegriffen.


    Ich hoffe damit ist das geklärt. Das es Möglichkeiten gibt, mit denen es einfacher geht, hab ich nicht abgestritten, ich wollte nur zeigen, dass es doch funktioniert.


    MFG

    zEriX

  14. #14
    Registrierter Benutzer Avatar von BLUESCREEN3D
    Registriert seit
    08.11.2002
    Beiträge
    665
    Guckt der Threadersteller hier überhaupt noch rein, oder war das nur mal wieder jemand, der eval() nutzen wollte, weil er den richtigen Weg nicht kannte?

    @zerix: Was du vorschlägst, wäre ja, selbst einen Parser für Java-Code zu schreiben ...

    Zitat Zitat von Waxolunist Beitrag anzeigen
    Und wie machst du das mit if-Schleifen?
    Es gibt keine "if-Schleifen".

  15. #15
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Zitat Zitat von BLUESCREEN3D Beitrag anzeigen
    Guckt der Threadersteller hier überhaupt noch rein, oder war das nur mal wieder jemand, der eval() nutzen wollte, weil er den richtigen Weg nicht kannte?

    @zerix: Was du vorschlägst, wäre ja, selbst einen Parser für Java-Code zu schreiben ...


    Es gibt keine "if-Schleifen".
    I-Tüpfelchen-Reiter

    Aber, dass es ein Parser sein müsste, habe ich eben schon gesagt. Ich hätte gerne gesehen, ob mein Beispiel lösbar ist. Aber hier auf einen unbekannten Dritten zu verweisen ist ein bisschen .... weiß nicht, irgendwie feige?
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •