Dies ist der Java Adapter für mein Projekt namens Hydra
. Die Aufgabe dieses Projektes ist es,
die Kompilierung sowie die Ausführung von Java-Sourcedateien zu übernehmen. Der Adapter
analysiert die kompilierten Klassen und baut über sie eine Struktur auf, die an das Frontend
gesendet und von diesem verwendet werden kann.
Angenommen der Nutzer hat in einem Projekt eine Source-Datei namens Mango.java
, die wie folgt
strukturiert ist:
public class Mango {
private String color = "#FF0000";
public void makeGreen() {
color = "#00FF00";
}
}
Der Nutzer hat dann im Frontend die Möglichkeit, eine neue Instanz dieser Mango zu erstellen.
Diese wird dann in einem Fenster mit einem Bild einer Mango angezeigt, die durch den angegebenen
Farbwert rot gefärbt ist. Sollte der Nutzer nun über das Frontend die Methode makeGreen
aufrufen,
wird sich der Wert von color
dementsprechend ändern und die Mango ist ab dann grün gefärbt.
Der Adapter startet mit einer Kompilierung der Source-Dateien. Diese werden zu einer Jar
zusammengefügt, welche über einen Classloader geladen wird. Anschließend wird mit Reflection
über den JarAnalyzer
die Struktur der Klassen aufgebaut, welche über das Datenobjekt namens
ObjectData
repräsentiert wird.
Mit Hilfe des ObjectPool
s können Instanzen dieser Klassen erstellt werden, die im Kern eine
echte Instanz der vom Nutzer erstellten Klasse beinhalten. Diese werden dann durch die Klasse
RuntimeObjectInstance
gemanaged. Anschließend können über den ObjectPool verschiedene
Modifikationen in diesen Instanzen unternommen werden, wie Methoden aufzurufen. Änderungen
in den Klassen werden in einem sogenannten ChangeScope
gesammelt, damit diese korrekt
modifiziert werden. Jede Instanz hat einen TrackingRecord
, welcher Referenzen auf andere
runtime instances haben kann, wodurch Veränderungen in diesen Referenzen ebenso festgestellt
werden können.
Besonders ist auch ein eigenes Type System, welches verwendet wird, um Unterstützung für
generische Klassen herzustellen. Dieses nutzt einen AST der Source-Dateien, um einen exakten
Typ für generische Typen aufzubauen. Zu finden ist dieses System unter jars/ast
mit der
zentralen Klasse ClassOrGenericType
.
Priorität lege ich sehr auf die Lesbarkeit des Codes, weshalb ich einen Linter mit durchaus strengen Regeln verwende. Dokumentation ist für mich ebenso sehr wichtig, weshalb vor allem in Dateien und Änderungen nach 2022 vermehrt viele Kommentare und Javadoc zu finden sind. Anschließend ist es mir wichtig, dass sämtliche Änderungen und Features korrekt funktonieren, weshalb zu jedem zentralen System automatisierte Tests vorhanden sind. Zuletzt folgt das korrekte Design von Datenstrukturen, welche mir eine möglichst simple und optimale Umsetzung verschiedener Algorithmen erlauben. Viele der Strukturen, wie sie in diesem Projekt existieren, befinden sich im Zustand ihrer Erstimplementierung, da kein refactoring nötig war.