Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation

norden

Mitglied
Hallo,

ich habe eine etwas außergewöhnliche Idee:

Ich möchte Klassen mit einer eigenen Annotation (@MyAnnotation) annotieren. Die Objekte dieser Klassen sollen dann bei der Initialisierung automatisch eine von mir generierte ID erhalten, die bei der weiteren Verarbeitung genutzt werden kann.

Ich habe mir bereits AspectJ angesehen und folgendes funktioniert schonmal:

Annotation:
Java:
public @interface MyAnnotation{
}

Beispielobjekt:
Java:
@MyAnnotation
public class Example {
	public Example() {
		System.out.println("Constructor");
	}
}

Aspect:
Java:
public aspect ExampleAspect {
	Long id;
	after() : execution((@MyAnnotation *).new(..)){
		id = IdProvider.getId(); // hier wird die ID vergeben
		System.out.println(id);
	}
}


Hier wird jetzt einfach eine ID nach dem Aufruf des Constructors ausgegeben.. ab jetzt habe ich auch nach langem suchen keine Idee, wie ich weitermachen könnte.. :/

Kann mir vielleicht jmd helfen?
 

kaoZ

Top Contributor
Kurzum du möchtest also einfach für jedes erzeugte Objekt eine eigens dafür generierte ID ? ich werd sonst aus deiner Fragestellung nicht so ganz schlau , wenn es überhaupt eine ist ^^
 

norden

Mitglied
Kurzum du möchtest also einfach für jedes erzeugte Objekt eine eigens dafür generierte ID ? ich werd sonst aus deiner Fragestellung nicht so ganz schlau , wenn es überhaupt eine ist ^^

Korrekt ;)

ich habe es jetzt folgendermaßen gelöst:

Java:
@Target(ElementType.TYPE)
public @interface MyAnnotation{
}

Java:
@Aspect
public class MyAspect {

	@Pointcut("execution((@MyAnnotation *).new(..))")
	public void bla() {

	}

	@After("bla()")
	public void after(JoinPoint joinPoint) {
		try {
			joinPoint.getTarget().getClass().getDeclaredField("id")
                                                      .set(joinPoint.getTarget(), VersionProvider.getVersion());
		} catch (IllegalAccessException | NoSuchFieldException e) {
			e.printStackTrace();
		}
	}

}


Java:
@MyAnnotation
public class Example {

	public long id;

	public long getId() {
		return id;
	}

}
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Gibt es einen bestimmten Grund, warum diese Klassen nicht einfach von einer Superklasse erben, die ein Feld "id" hat, das im Konstruktor gesetzt wird!?
 

norden

Mitglied
Ja den gibt es:

Wir schreiben eine Datenbank-API, die mit entities von anderen Benutzern der API umgehen können soll. Dabei sollen die Nutzer so wenig wie möglich von der Anwesenheit unserer API mitbekommen. Es ist im Moment eigentlich schon zu viel, das Attribut id (bzw irgend nen anderer name dafür) in der entity unterbringen zu müssen. Erst recht sollen sie aber nicht eine Klasse extenden müssen. Nur eine Annotation wäre genau richtig.
 

Ruzmanz

Top Contributor
ich habe eine etwas außergewöhnliche Idee:

Ich möchte Klassen mit einer eigenen Annotation (@MyAnnotation) annotieren. Die Objekte dieser Klassen sollen dann bei der Initialisierung automatisch eine von mir generierte ID erhalten, die bei der weiteren Verarbeitung genutzt werden kann.

Moment! Reihe dich bitte ganz ganz hinten in der Schlange ein. Du bist sicherlich nicht in den Top 100 der Leute, die diese Idee hatten.

Es ist im Moment eigentlich schon zu viel, das Attribut id (bzw irgend nen anderer name dafür) in der entity unterbringen zu müssen. Erst recht sollen sie aber nicht eine Klasse extenden müssen. Nur eine Annotation wäre genau richtig.

Funktioniert nicht ohne Einschränkung. Du kannst hashCode, equals oder die Referenz benutzen. Ohne eine Instanzvariable, wird das Objekt nie eindeutig. Zudem kannst du dich von dem Traum einer Annotation verabschieden. Schau dir z.B. JPA an:

JPA Entity Primary Key (@Id, @IdClass, @EmbeddedId)

... es hat schon seinen Grund warum es "@Id long id;" heißt und nicht nur "long id;" (oder irgend ein anderer Name).
 
Zuletzt bearbeitet:

norden

Mitglied
Moment! Reihe dich bitte ganz ganz hinten in der Schlange ein. Du bist sicherlich nicht in den Top 100 der Leute, die diese Idee hatten.

Damit meinte ich auch nur, dass es keine alltägliche Idee ist. Ich wollte mich sicherlich nicht als einen der Top 100 darstellen :p

Funktioniert nicht ohne Einschränkung. Du kannst hashCode, equals oder die Referenz benutzen. Ohne eine Instanzvariable, wird das Objekt nie eindeutig. Zudem kannst du dich von dem Traum einer Annotation verabschieden. Schau dir z.B. JPA an:

JPA Entity Primary Key (@Id, @IdClass, @EmbeddedId)

... es hat schon seinen Grund warum es "@Id long id;" heißt und nicht nur "long id;" (oder irgend ein anderer Name).

Danke für die Info.
 

norden

Mitglied
Hallo,

ich bin nun auf ein anderes Problem gestoßen. Die lib kann momentan nicht in anderen Projekten verwendet werden, da das weaving nicht durchgeführt wird. Ich stehe leider im Moment etwas auf dem Schlauch, ob es überhaupt so möglich ist, wie ich mir das vorstelle.

Hier meine momentane Lösung:

Darwin-Annotation:
Java:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Darwin {}

Darwin-Version-Annotation:
Java:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DarwinVersion {}

Darwin-Aspect:
Java:
import java.lang.reflect.Field;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public privileged aspect DarwinAspect {

	private final static Logger LOGGER = LoggerFactory.getLogger(DarwinAspect.class);

	after(): execution((@(package der klasse).Darwin *).new(..)) {
		int numberOfDarwinVersionFields = 0;
		LOGGER.debug("Try to add version!");
		try {
			Field darwinVersionField = null;
			for (Field field : thisJoinPoint.getTarget().getClass().getDeclaredFields()) {
				if (field.isAnnotationPresent(DarwinVersion.class)) {
					numberOfDarwinVersionFields++;
					LOGGER.debug("DarwinVersion found on field " + field + "!");
					darwinVersionField = field;
				}
			}
			if (numberOfDarwinVersionFields > 1) {
				LOGGER.error("To many @DarwinVersion annotations in class " + thisJoinPoint.getTarget().getClass() + "!");
			} else if (numberOfDarwinVersionFields == 0) {
				LOGGER.error("No DarwinVersion field found in class " + thisJoinPoint.getTarget().getClass() + "!");
			} else if (darwinVersionField != null) {
				LOGGER.debug("Set DarwinVersion on field " + darwinVersionField + "!");
				darwinVersionField.setAccessible(true);
				darwinVersionField.set(thisJoinPoint.getTarget(), VersionProvider.getVersion(thisJoinPoint.getTarget().getClass()));
			}
		} catch (IllegalAccessException e) {
			LOGGER.error(e.getLocalizedMessage());
		}
	}

}

Example of usage:
Java:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


@Darwin
public class Example {

   @DarwinVersion
   private Long version;

   private final static Logger LOGGER = LoggerFactory.getLogger(Example.class);

   public static void main(String[] args) {

      Example example = new Example();
      System.out.println(example);

      Example example1 = new Example();
      System.out.println(example1);

      Example example2 = new Example();
      System.out.println(example2);

      Example example3 = new Example();
      System.out.println(example3);

   }

   @Override
   public String toString() {
      return "Example{" + "version=" + version + '}';
   }
}

In dem Beispiel funktioniert es genau so wie ich will: Beim instanziieren eines "Example"-Objektes wird Automatisch eine Versionsnummer vergeben und in der variable mit der Annotation "DarwinVersion" abgespeichert.

Leider funktioniert das allerdings nur innerhalb des Projektes. Ich möchte aber, dass Nutzer der Darwin-lib selbst Klassen anlegen und mit den Darwin-Annotationen versehen können. Dazu muss doch eigentlich der aspect zur lauf/comile-zeit in die Klasse "geweavet" werden oder?

Viele Grüße,

Marcel
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Lukas2904 Automatisches starten des Programms Allgemeine Java-Themen 5
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
A automatisches layout für graphen Allgemeine Java-Themen 5
J Automatisches Refactoring? Allgemeine Java-Themen 7
S automatisches schließen des prog Allgemeine Java-Themen 2
C In DefaultTableModel nachträglich Werte einfügen Allgemeine Java-Themen 2
A Java ListNode Element einfügen ohne Bibliothek Allgemeine Java-Themen 6
S Link element an vorletzte stelle einfügen Allgemeine Java-Themen 2
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
G Excel Tabelle lesen und in neue Excel Tabelle einfügen Allgemeine Java-Themen 11
S Wo .close() einfügen? Allgemeine Java-Themen 0
I Apache POI Word Text einfügen Allgemeine Java-Themen 26
K Swing OpenStreetMap in JFrame einfügen Allgemeine Java-Themen 1
B Eclipse Ekit-Editor einfügen Allgemeine Java-Themen 0
T Neuen Kanal in Bild (TIFF) einfügen à la Photoshop Allgemeine Java-Themen 2
D Symbol in Word-Dokument einfügen Allgemeine Java-Themen 1
F 2D Array in jList einfügen Allgemeine Java-Themen 8
J XML Dokument Zeilenumbruch in den Quellcode einfügen Allgemeine Java-Themen 5
H Semicolon Einfügen JSP Seite Allgemeine Java-Themen 9
K Neue Elemente in JList einfügen Allgemeine Java-Themen 2
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
S JPanel einfügen in MainClass Allgemeine Java-Themen 4
R Schnelles Einfügen in SortedSet Allgemeine Java-Themen 11
Z Ausschneiden, Kopieren, Einfügen, Löschen in JTextArea Allgemeine Java-Themen 5
JAVAnnik Bilder in JLabel Array einfügen Allgemeine Java-Themen 2
E Bild mit Listener einfügen Allgemeine Java-Themen 3
reibi Leeres Verzeichnis in ein Zipfile einfügen Allgemeine Java-Themen 12
N Tupel in eine SET einfügen Allgemeine Java-Themen 3
S Progressbar einfügen Allgemeine Java-Themen 4
W xml File einlesen und in eine andere xml File einfügen.. Allgemeine Java-Themen 2
L List <Hauser> in Combobox einfügen Allgemeine Java-Themen 5
D Kopieren und Einfügen Allgemeine Java-Themen 8
D Einfügen über JMenuBar Allgemeine Java-Themen 4
N einfügen string in methode Allgemeine Java-Themen 10
R doppelt verkettete Liste: Fehler beim Einfügen Allgemeine Java-Themen 3
G Zeile einfügen in TreeTable Allgemeine Java-Themen 2
G Teilstring in einen String einfügen Allgemeine Java-Themen 5
G Tabelleneintrag einfügen Allgemeine Java-Themen 10
P JTree/ Nodes einfügen Allgemeine Java-Themen 2
G Plug-in: Wie JButton einfügen? Allgemeine Java-Themen 12
A FileChannel: Mitten in eine Datei was einfügen Allgemeine Java-Themen 2
W Daten in Access einfügen über Java Allgemeine Java-Themen 21
G Plugin (Visual Editor) in Eclipse einfügen Allgemeine Java-Themen 2
Zed JList Object einfügen und Text anzeigen Allgemeine Java-Themen 3
P Timestamp in eine Firebird-Datenbank einfügen Allgemeine Java-Themen 6
K Bilder mit Java in MS Word einfügen Allgemeine Java-Themen 2
M Text in JTextfield einfügen sofort dann wird Text gekürzt Allgemeine Java-Themen 2
H html datein einfügen Allgemeine Java-Themen 7
M Pfeilzeichen (z.B. ALT + 26) einfügen Allgemeine Java-Themen 2
S Bild aus Zwischenablage in Applet einfügen Allgemeine Java-Themen 2
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
S Werte in Tabelle einfügen! Allgemeine Java-Themen 9
N Zeilenumbruch in String nach jeweils x Zeichen einfügen? Allgemeine Java-Themen 6
G Text cursorgenau einfügen [ehemals hilfe ... dringend] Allgemeine Java-Themen 7
G Hilfe - JButton in JTable (Spalte) einfügen! Allgemeine Java-Themen 6
S addAtPosition - Zahl an einer bestimmten Position einfügen Allgemeine Java-Themen 8
G wie Klasse in JFrame "einfügen" Allgemeine Java-Themen 12
D iText: Tabelle in Footer einfügen Allgemeine Java-Themen 6
G Einfügen von Werten aus TXT-Datei in ein Array !?! Allgemeine Java-Themen 9
P Verschiedene Aspekte einer idempotent API verstehen? Allgemeine Java-Themen 16
Zrebna Ausführung einer Testmethode in der IDE erfolgreich - failt aber via 'mvn test' Allgemeine Java-Themen 5
S Interpreter-Fehler Kann mir das mal einer erklären? Allgemeine Java-Themen 12
Zrebna Aus einer jar-Datei eine exe-Datei erzeugen lassen Allgemeine Java-Themen 37
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11

Ähnliche Java Themen


Oben