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

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

Was möchtest Du wissen?