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 Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • AtomicInteger vs. Integer

    24.03.2019

    Ich habe am Wochenende wieder einmal mit Java-Benchmarks experimentiert

    Weiterlesen...

Neueste Artikel

  • Konstruktive Geometrie mit dem Computer

    Ich habe in einem vorhergehenden Artikel beschrieben, dass ich eine weitere neue Graphik-Primitive erstellt habe. Dabei musste ich mir meine verschütteten Trigonometrie-Kenntnisse wieder vor Augen führen - mit Bleistift und Papier. Das müsste doch auch anders gehen dachte ich mir und begann...

    Weiterlesen...
  • GitHub-Projekte

    Mal abgesehen von den anderen Links, die ich in unregelmäßigen Intervallen hier poste kommt heute ein Schwung (aus meiner Sicht) interessanter/skurriler Projekte auf GitHub:

    Weiterlesen...
  • Mehrere Datenbanken und Postgis-Erweiterung in Docker

    Ich hatte ja schon beschrieben, dass ich mich in diesem Jahr wieder intensiver um mein Geoinformationssystem EBMap4D kümmern möchte. Dazu habe ich jetzt einige infrastrukturelle Vorbereitungen getroffen...

    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, muß 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 GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.