Aspect-orientierte Programmierung oder kurz AOP klingt interessant für jemanden, der sich mit dem Programmieren nicht nur praktisch beschäftigt, sondern bei neuen Konzepten auch hinter die Theorie schauen möchte.
Besonders skeptisch bin ich immer dann, wenn Programmiersprachen ein neues Feature übergeholfen bekommen. Viele der neuen Features von Java, die in den letzten Jahren hinzukamen, betrachte ich als syntactic sugar. Konstrukte, die eine Aufgabe übernehmen sollen für die es bereits eine gültige Syntax gibt, haben meiner Ansicht nach keine Daseinsberechtigung. Ich sehe das aus der Warte desjenigen, der Code warten soll.
Das Verstehen von Code wird schwieriger, wenn es viele verschiedene Möglichkeiten gibt, ein und denselben Sachverhalt auszudrücken. Ein Paradebeispiel dafür ist die Iteration über Collections oder Arrays - das kann man auch hervorragend mit den bereits vorhandenen Schleifenkonstrukten erledigen - wozu noch ein weiteres einführen?
Neulich hatte ich aber ein Problem, das zugegebenermaßen überaus akademisch ist und so auch nur mir passieren kann, das ich aber trotzdem durch AOP lösen konnte. Ich arbeitete bei einem Kunden mit einem von mir selbst entwickelten Werkzeug. Beim Arbeiten trat eine Exception auf, deren Ursache im Stacktrace klar zu erkennen war. Es war ein Methodenaufruf, dessen Ergebnis ich bei der zu lösenden Aufgabe nicht benötigte. Leider hatte ich den Quelltext nicht dabei und konnte den Fehler daher nicht sofort fixen.
Ich überlegte mir daraufhin folgendes: Wenn es möglich wäre, die nicht unbedingt benötigte Methode zu kapseln, einfach einen Default-Rückgabewert zu erzeugen und die Exception zu verschlucken, könnte die Anwendung weiterarbeiten. Man würde dazu eine Möglichkeit brauchen, den Aspect und die Intrumentierung zur Laufzeit des Programmes ohne Quelltextänderung und Neuübersetzung durchzuführen.
Ich habe zwei Alternativen untersucht: Bei AspectJ habe ich keine Möglichkeit gefunden, die Pointcuts ohne Kompilierer zu definieren. AspectWerkz bietet diese Möglichkeit. Ich setzte ein kleines Testprojekt auf und definierte einen Pointcut um eine der Methoden herum. Damit funktionierte das ganze hervorragend. Beim abschließenden Test ging jedoch etwas schief: Ich änderte die Methode derart, daß sie unter gewissen Umständen eine Exception werfen sollte. Danach konnte ich die Anwendung nur noch ohne AOP-Instrumentierung starten: sobald die Instrumentierung wieder aktiviert wurde, bewarf mich Java mit einer VerifyError-Exception:
Exception in thread "main" java.lang.VerifyError: Expecting a stackmap frame at branch target 27 in method de.elbosso.scratch.aop.HelloWorld.aw$original$_AW_$greet$_AW_$de_elbosso_scratch_aop_HelloWorld()Ljava/lang/String; at offset 14 at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2521) at java.lang.Class.getMethod0(Class.java:2764) at java.lang.Class.getMethod(Class.java:1653) at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)Die Suche nach der Ursache und einer Lösung gestaltete sich nicht trivial. Letztlich stellte sich heraus, daß die Ursache darin begründet lag, daß AspectWerkz noch nicht mit dem ByteCode-Format von Java7 zurechtkommt, sobald eine throws-Anweisung in einer der Methoden auftaucht. Die Lösung des Problems war, die Klassen für das ByteCode-Format von Java6 zu übersetzen.
27.08.2017
Nachdem ich vor einiger Zeit bereits einen Artikel zu den Möglichkeiten der aspekt-orientierten Programmierung veröffentlicht habe, hier nun ein weiterer UseCase.
04.06.2016
Nachdem ich in einem meiner vorherigen Artikel über Pläne zu meiner Weiterbildung schrieb, habe ich nochmals einen Gedanken wieder aufgegriffen, mit dem ich mir schon verschiedentlich die Zeit vertrieb...
Multi-User-WebDAV, Docker, GitHub
17.11.2019
Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...
Weiterlesen...Android Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Gui Hardware Java Jupyter Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
In eigener Sache...
Weiterlesen...Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.
Weiterlesen...Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.
Weiterlesen...Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.