Frage von MatejAustria, 22

Kann man ein Java Programm so schreiben, dass der Nutzer durch Eingaben (Scanner, GUI-Textfeld,...) den Code ändern kann?

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Palladin007, 14

Ich kann nur für C# sprechen, aber da Java und C# ein ähnliches Konzept verfolgen, liegt meine Antwort vermutlich nicht so weit daneben.

Prinzipiell kann ich schon mal sagen:
Ja, man kann den Code zur Laufzeit ändern, aber nur einmal, bevor die Runtime den "Zwischen-Code" kompiliert. Da kann man pro Methode den Verweis auf den Code selber ändern, aber das ist nicht ganz einfach und ganz sicher das falscheste (falls es das Wort überhaupt gibt) Weg, den Du einschlagen kannst.
Nein, man kann den Code nicht beliebig ändern. Wurde der Byte-Code einmal kompiliert, müsstest Du das ganze auf reiner Maschinen-Code-Ebene machen und abgesehen, dass dabei vermutlich jeder Virenscanner verückt spielt, ist das nochmal eine Ecke komplizierter. Dass das eine ganz blöde Idee ist, brauch ich hoffentlich nicht erklären.
Ja, man Code zur Laufzeit erzeugen und kompilieren. Das ist bedeutens einfacher, aber dennoch nicht einfach und meistens eine schlechte Idee.

Für sowas definiert man Kriterien, über die das Verhalten des Programms bestimmt werden können. Beispielsweise könntest Du bei einer Suchfunktion mögliche Eigenschaften auflisten, aus denen der benutzer auswählt und dann verschiedene Kriterien für jede Eigenschaft anbietet. Excel hat das in der Filter-Funktion ganz schick umgesetzt, wie ich finde.
Oder Du denkst dir ein Knzept aus, wo eine Methode einen bestimmten Arbeitsschritt darstellt. Je nachdem, was der Benutzer anklickt, wird diese Methode "registriert", bis am Ende einfach die Liste von Methoden runter gespielt wird.

Wenn Du zwingend, unbedingt, Code zur Laufzeit ändern musst, dann nutze die Features der Objektorientierung.
Zuerst einmal brauchst Du ein Interface, das beschreibt, wie dieser geänderte Code aufgerufen und vom Programm genutzt werden kann. Bei neuem Code musst Du diesen dann generieren und als Klasse, die dieses Interface implementiert, abspeichern.
Willst Du etwas Vorhandenes ändern, dann kannst Du von dieser Klasse ableiten und die betreffenden Methoden überschreiben. Die Konzepte Vererbung und Polymorphie ist genau dafür gedacht, nur dass das normalerweise nicht zur Laufzeit und dynamisch abläuft.

Auf diese Weise kannst Du dann eine Art Mini-Plugin erzeugen, abspeichern und im Programm immer wieder zur Auswahl anbieten.

Aber vorsicht: Wenn Du dir nicht ganz sicher bist, was Du da tust, dann baust Du dir einen Monoliten mit mehr möglichen Fehlerquellen als Code-Zeilen, der über kurz oder lang nicht mehr wartbar ist.

Bevor Du das aber angehst, stell dir erst einmal diese Fragen:

  • Brauche ich das wirklich? Oder ist das am Ende ein riesiges Feature, was einen kleinenBereich abdeckt und kaum genutzt wird?
  • Was hat der Benutzer davon und wie kann ich es anders/einfacher genauso angenehm ermöglichen?
  • Traue ich mir das zu?

Zum Rumspielen und Verstehen, wie alles zusammen hängt, ist das echt super, aber für ein produktives Programm keine gute Idee.

Antwort
von Tobihogh, 14

Du musst die Eingabe erst kompilieren und kannst es dann mit dem Classloader ausführen. Dieser Link müsste dir beim Kompelieren während der Laufzeit helfen: http://www.javaworld.com/article/2077497/testing-debugging/java-tip-131--make-a-... habs aber nur kurz überflogen.

Antwort
von DerDudude, 6

Das wird ziemlich schwierig.

Liegt daran, dass das Programm erstmal kompiliert wird und somit nicht mehr als Klartext vorhanden ist.

Um dann den Code zu ändern, müsste der Code aus der Maschinensprache erstmal wieder in Menschensprache übersetzt werden, um dann den neuen Code einzufügen.

Gibt bestimmt auch andere Wege, aber ich würde mir da nicht so viel vornehmen.

Kommentar von androhecker ,

Nicht Maschinensprache, in dem Fall Java Bytecode.

Kommentar von DerDudude ,

Man weiß, was gemeint ist.

Aber du hast natürlich Recht.

Antwort
von Buh13246, 10

Vieleicht geht es wenn ich den Code in eine externe .java Datei implementiere und dann vom Codes aus die Java Datei kompelieren lasse . Weiter weiß ich auch nicht

Antwort
von brknwndrlnd, 10

Du meinst direkt den laufenden Code? Nein, geht nicht. ;o

Was willst du denn machen? Gibt selbst bei Java immer einen weg drumherum.

Antwort
von phigeek, 6

Sollte mit dem Classloader gehen. Ich selbst habe es zwar nicht ausprobiert, doch eine detaillierte Anleitung, wie man Ausdrücke (Expressions) zur Laufzeit kompiliert findest Du z. B. hier:

http://www.beyondlinux.com/2011/07/20/3-steps-to-dynamically-compile-instantiate...

Die wesentliche Methode ist hier:

ToolProvider.getSystemJavaCompiler()


Antwort
von androhecker, 8

Geht nicht und ist auch richtig so.

Java Code muss vor dem Ausführen erst zu Java Bytecode kompiliert werden, direktes Interpretieren wird nicht gemacht.

Kommentar von stellarwind ,

er kann den code ja kompilieren lassen..

Kommentar von androhecker ,

Das ist kein Live Editing mehr, das geht nur mit Sprachen wie Python.

Keine passende Antwort gefunden?

Fragen Sie die Community