equals-Methode bestimmer Klassen abfangen

SimProtect

Aktives Mitglied
Hallo Leute,
Ich habe mal wieder eine Frage, zu welcher meine Google-Suchergebnisse unzureichend waren.
Kurzform der Problemstellung:
In unserem aktuellen Framework soll es eine Möglichkeit geben, eine bestimmte Implementierung der equals-Methode beim Programmstart zu verwenden/nutzen, wenn die Klasse mit einer bestimmten Annotation versehen worden ist.
Dabei sind die koknrete Implementierung oder Objekthierarchien der jeweiligen Klasse unbekannt. Ich weiß also auch nichts über die Oberklassen oder implementierten Interfaces bzw. ob solche überhaupt vorhanden sind

Ich habe in Java noch nie mit einer entsprechenden Mechanik gearbeitet - wohl aber in anderen Programmiersprachen. Dort wurden die entsprechenden Instanzen der Klasse zur Laufzeit mit einem Proxy versehen, der entweder Methodenaufrufe an das originale Objekt weiterleiten oder durch einen anderen Aufruf ersetzen.

Leider waren alle meine Versuche, etwas entsprechendes in Java umzusetzen nicht von Erfolg geprägt - meine Google-Suchen ebensowenig.

Daher wollte ich mal hier fragen, welchen Ansatz ich hier am besten verfolgen soll oder ob das so überhaupt möglich ist.

Noch als relevante Information: Wir haben die aktuellste Java-Version im Einsatz und wir nutzen Spring inklusive AOP. Allerdings habe ich persönlich bisher wenig mit Spring AOP gearbeitet. Generell "komme" ich aus einem anderen Programmiersprachenkontext - daher bitte ich mein ggf. vorhandenes Unwissen über die Java-Mechaniken zu entschuldigen und bitte Euch um Hilfe.

Liebe Grüße

PS: Ich habe folgenden Proxy in Java entwickelt, welcher die Mechanik bereits umsetzt. Allerdings erfordert dieser einen Default-Konstruktor, der nicht public sein darf. Das ist damit nicht zufriedenstellend für die aktuelle angestrebte Architektur. Da sollen nämlich solche Konstruktoren vermieden werden.

Code:
  public static Object createProxyOf(Object object) {
     return Enhancer.create(object.getClass(), new MethodInterceptor() {

       public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
         if ("equals".equals(method.getName())) {
           return checkEqualityOf(o, args[0]);
         } else {
           return methodProxy.invokeSuper(o, args);
         }
       }
     });
   }
 
Zuletzt bearbeitet:

stg

Top Contributor
Grundsätzlich hast du zwei Möglichkeiten. Einmal, wie von dir vorgeschlagen, über Proxys, oder aber per Bytecode-Modifikation. Du/Ihr habt dich/euch aber ja anscheinend schon für den Weg über die Proxys entschieden, was auch vollkommen OK ist. Ansonsten konnte ich in deinem Post keine wirkliche Frage entdecken...

Allerdings erfordert dieser einen Default-Konstruktor, der nicht public sein darf.

Das wird schwierig, denn der default-Konstruktor IST public.
 

SimProtect

Aktives Mitglied
Ach ich und Kommunikation - wir sind manchmal nicht die besten Freunde...

Ich greife zunächst einmal Deinen letzten Satz auf:
Da habe ich einen Schreibfehler eingebaut: Natürlich erfordert Spring bzw. CGLib einen Default-Konstruktor, der public sein MUSS (bzw. nicht private sein darf). Entschuldige bitte diesen Fehler.

Warum haben wir damit ein Problem? Nun, in den meisten(!) Fällen, soll das Objekt in der (eigenen) BusinessLogik natürlich über seinen "Hauptkonstruktor" aufgebaut werden. Ein sichtbarer Default-Konstruktor umgeht da ggfs. Logiken. Unser aktuelles Projekt verwendet kein Hibernate o.Ä., weshalb wir bisher keinen entsprechenden Konstruktor brauchten und auch nicht wollten.
Dieses Projekt soll später von Nutzern genutzt und erweitert werden, die nicht aus unserem Hause sind. Da hält unser Architekt sichtbare Schnittstellen, die aber nicht verwendet werden soll, für eine äußerst unschöne Lösung.
Daher belassen wir den Default-Konstruktor nur in Objekten, die keine Parameter benötigen. Ansonsten gibt es immer einen konkreten Konstruktor oder der Default wird mit dem Modifier private versehen (z.B. Util-Klassen, die nicht initialisiert werden sollen.)

Dann zu Deinem ersten Punkt:
So wirklich entschieden habe ich mich hier noch nicht. Ich habe nur das Ziel vorgegeben, nicht aber die technische Umsetzung. Die Proxy-Lösung kannte ich noch aus früheren Projekten bzw. anderen Sprachen. Daher war das die Lösung, die mir natürlich als erstes in den Kopf kam. Allerdings wusste ich zu diesem Zeitpunkt nicht, wie gangbar oder ungangwar diese Lösung in Java sein würde.

Daher war meine Frage, wie ich das in Java am sinnigsten löse?

Für die Proxy-Lösung habe ich (in meiner bisherigen Umsetzung und in Betrachtung unserer Architekturvorgaben) folgende Nachteile entdeckt:
-> Ich muss einen Default-Konstruktor angeben (hier könnte ich zwar mit dem Architekten sicherlich reden, aber grundsätzlich sollte ich natürlich erstmal Versuchen, eine Lösung zu finden, durch welche die Architektur eingehalten wird)
-> Es besteht zur Laufzeit der Aufwand, dass man neue Instanzen der entsprechenden Klassen "abfangen" und durch Proxy-Objekte ersetzen muss. Aktuell ist dies noch kein großes Problem, da sich die aktuellen BO im System registrieren müssen und ich sie in diesem Vorgang natürlich ersetzen kann, wirklich fein ist das auch nicht. Es bietet viel Raum für Fehler.

Kann ich diese Nachteile umgehen? Hat da jemand eine Idee für mich? Oder eine bestimmte Bibliothek?

Wie sähe denn eine Bytecodemanipulation aus?
Welche Vorteile bzw. welche Nachteile hätte eine solches Vorgehen?

Liebe Grüße und einen schönen Sonntag :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Problem mit der .equals()-Methode Allgemeine Java-Themen 2
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
B Probleme mit eigener equals Methode Allgemeine Java-Themen 18
B Equals Methode überschreiben mit Array Allgemeine Java-Themen 2
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
P Strings: equals vs == Allgemeine Java-Themen 47
F Methoden hashCode() & equals() Allgemeine Java-Themen 13
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
T Collections TreeSet.contains ruft nicht .equals? Allgemeine Java-Themen 4
T Compiler-Fehler not equals Allgemeine Java-Themen 22
V ArrayList vergleichen mit .equals? Allgemeine Java-Themen 13
A mit .equals Array befüllen schlägt teilweise fehl Allgemeine Java-Themen 3
G Probleme mit equals Allgemeine Java-Themen 3
R Merkwürdiges Verhalten der equals Method Allgemeine Java-Themen 4
tuttle64 equals() und == Allgemeine Java-Themen 4
H double dispatch und equals(Object) Allgemeine Java-Themen 6
S equals - Identität ändern bei Vererbung? Allgemeine Java-Themen 5
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
J Best Practice für implementierung von equals(...) Allgemeine Java-Themen 7
M equals & compareTo Allgemeine Java-Themen 15
M Warum Strings mit equals vergleichen... Allgemeine Java-Themen 6
T Wie intelligent ist dieses überschriebene .equals() ? Allgemeine Java-Themen 13
G Objektvergleich mit equals Allgemeine Java-Themen 5
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
M String#equals(), Probleme mit großen Strings? Allgemeine Java-Themen 4
André Uhres equals überschreiben Allgemeine Java-Themen 31
F Problem: mehrere Interfaces definieren equals() neu Allgemeine Java-Themen 24
A equals() macht nicht, was es soll Allgemeine Java-Themen 4
M equals() != compareTo() ? Allgemeine Java-Themen 3
M String mit equals() vergleichen - Frage Allgemeine Java-Themen 3
S equals überladen Allgemeine Java-Themen 15
S Mal was allgemeines zu equals() Allgemeine Java-Themen 12
J Arrays vergleichen mit equals Allgemeine Java-Themen 8
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18

Ähnliche Java Themen

Neue Themen


Oben