Aspekt-orientierte Programmierung zum Umgehen von Fehlern

vorhergehende Artikel in: Java
07.09.2014

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.

Neue Features und Konzepte in Programmiersprachen

Generell bin ich eher skeptisch, wenn wieder mal eine neue Sau mit Buzzword-verdächtigem Namen durchs Dorf getrieben wird, ohne zu erklären, warum ihr Schinken so viel besser schmecken soll als der der anderen Schweine.

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?

AOP

Aber kommen wir zu AOP. Die Beispiele, die man immer wieder sieht sind Instrumentierungen um entweder die Ausführung einer Methode zu detektieren, die Ausfüghrungszeit zu messen oder beides zusammen. Das wirkt bei mir nicht so, daß ich mir sagen würde: "Nachdenkenswert - das könnte Probleme lösen, die auch ich habe."

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.

Beispiel

Als Beispiel dafür habe ich hier ein kleines Projekt beigefügt, in dem die Datei build_aop.properties entsprechend des Installationsortes von AspectWerkz anzupassen ist.
Lizenz
AOP-Projekt

Artikel, die hierher verlinken

AOP identifiziert Exception-auslösende Instanz

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.

Vergleichende Bytecode-Analyse

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...

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • 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...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    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...
  • Integration von EBMap4D in die sQLshell

    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.