Annotations der aufrufenden Methode ermitteln

KingHale

Mitglied
Hi,

ich benötige eine Prüfung, ob die aufrufende Methode eine bestimmte Annotation hat und eventuell deren Wert.

Java:
@MyAnnotation( "someValue" )
void doSomething() {
        String str = getAnnotationValue();
}

String getAnnotationValue() {
	Throwable t = new Throwable();
	StackTraceElement[] elements = t.getStackTrace();

	String callerMethodName = elements[1].getMethodName();
	String callerClassName = elements[1].getClassName();
        Class cls = elements[1].getClass();
        return ?;
}

So weit so gut. Aber wie komme ich nun an die Annotation der Methode und deren Value?
 
G

Gast2

Gast
Über das Class Objekt kannst du dir die passende Methode suchen, wenn du die hast kannst du per
Method (Java 2 Platform SE 5.0)
alle Annotations der Methode auslesen. Über die Annotation kommst du dann an den Wert der Annotation.

Aber:
Das ganze schaut, vorsicht formuliert, interessant aus. Und das meine ich nicht im positiven Sinn ;)
Was bezweckst du damit? Wollst du nur den Wert der Annotation auslesen und das in eine eigene Methode auslagern?
 

KingHale

Mitglied
Es geht um die Implementierung einer Security-Frameworks (das von EJB ist leider nicht zu gebrauchen). Dabei kann eine Methode mittels die Annotation "PermissionRequired" erhalten (oder eben auch nicht). Eine zentrale Methode (eben diese dort unten) prüft dann, ob der User die erforderliche Berechtigung besitzt. Somit kenne ich (Methode unten) die Signatur der aufrufenden Methode nicht und

Code:
elements

kennt leider keine Methode "getMethod" obwohl die Signatur ja im Stack vorhanden ist. Das Thema "Annotation" scheint mir in Java etwas unausgereift. Noch einfacher wäre hier ein Aufruf von

Code:
elements[idx].getAnnotations()
was es leider auch nicht gibt :(
 
G

Gast2

Gast
Du hast da halt einfach nur einen Stacktrace, der ist im Prinzip nur ne Ansammlung von Strings die dir sagen wo nen Fehler aufgetreten ist. Das ist meiner Meinung nach auch irgendwie der falsche Weg daran zu gehen.

Java:
Class cls = elements[1].getClass();
Das liefert dir auch nicht das was du dir erwartest. elements ist ein Array vom Typ StackTraceElement.
Code:
cls
wird bei dir also StackTraceElement sein und ist NICHT die Klasse aus der der Stacktrace kommt.

Ich weiß aber auch grad nicht ob man noch irgendwie anders an die Annotations kommt. Den Weg den ich kenne ist:
- Class objekt holen
- gewünschte Methoden holen
- getAnnotation(...) oder isAnnotationPresent(...) aufrufen.

Vielleicht weiß da jemand anderes noch was schlaueres :)
 

KingHale

Mitglied
Du hast schon soweit recht. Allerdings ist der Stacktrace genau die Referenz in die vom ClassLoader geladenen Klassen und Methoden. Leider fehlen einige Informationen.
 

DanZ

Bekanntes Mitglied
Mit dem Stracktrace wird das nicht so einfach (wenn nicht sogar fast unmöglich) (so wie EikeB schreibt klappt es zwar, aber nur wenn es nur eine Methode mit diesem Namen in der Klasse gibt und trotzdem musst du da noch dran rumparsen).

Allerdings frag ich mich grade: Du musst ja, damit das klappt, in jeder Methode, die gesichert ist, diese checkPermission Methode aufrufen... wo genau hast du dann noch den Vorteil mit der Annotation(vorallem wenn es nur eine gibt)?
 

KingHale

Mitglied
Ich hab was gefunden, was funktioniert. Falls sich noch jemand für eine brauchbare Security-Implementierung interessiert die Rollen von Rechten entkoppelt:

Some method in any class (e.g. a servlet or session bean) gets the user context. This call automatically checks if a permission is required to call that method at all:

Java:
@PermissionRequired
void someMethod( String sessionId, ...) {
  HaleSessionContext ctx = getSessionContext( sessionId );
 ...
}

public getSessionContext( String sessionId ) {
   //--- Check permission before returning context
   if ( isPermissionRequired( 2 )) {
      //--- if annotated then check permission here
   }
}

private String isPermissionRequired( int level ) {
	Throwable t = new Throwable();
	StackTraceElement[] elements = t.getStackTrace();
	String callerClassName = elements[level].getClassName();
	String callerMethodName = elements[level].getMethodName();

	PermissionRequired perm = null ;
	try {
		Method m = Class.forName(callerClassName ).getMethod( callerMethodName );
		perm = m.getAnnotation( PermissionRequired.class );
	} catch (NoSuchMethodException | SecurityException | ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	//--- Calling method annotated => return class and method name
	if ( perm != null )
		return callerClassName + "." + callerMethodName ;

	//--- Calling method not annotated => return null
	return null;
}
 

KingHale

Mitglied
Das Prinzip ist folgendes:

Ein User ist einer oder mehreren Rollen zugeordnet. Rollen und User können vom Administrator frei definiert werden. An einer Rolle hängen die erlaubten Aktionen. Eine Aktion ist ganz einfach "className.methodName". Dann müssen nur noch die Methoden, für die eine Permission erforderlich ist, diese als Annotation erhalten.

Alle diese Methoden sind Methoden des Servers, die von irgendeinem Client (WebService, WebFrontend, Swing-App oder sonstwas) aufgerufen werden können.

Schlank, leicht lesbar und vor allem vom Kunden anpassbar. Rollen werden nicht vom Entwickler festgelegt, sondern vom Kunden der Anwendung.

Übrigens scheint "getAnnotation()" nicht bei "private" Methoden zu funktionieren!?!
 

KingHale

Mitglied
hmmm. Das heisst, ich benötige entweder immer die gleiche Signatur bei den annotierten Methoden oder eine weitere Zwischenschicht. Ärgerlich
 

DanZ

Bekanntes Mitglied
nein guck mal Class#getDeclaredMethods an. Aber du darfst jeden Methodennamen pro Klasse nur einmal vergeben.

Warum reicht dir das EJB System nicht? EJBContext#isUserInRole() und ein eigener JAAS Provider sollten doch das gleiche tun?
 
Zuletzt bearbeitet:

KingHale

Mitglied
Hey prima: getMethods() liefert die Namen. OK die Einschränkung ist, das jeder Methodenname in einer Klasse nur einmal vorkommen darf, aber das passt.

EJBContext#isUserInRole() reicht eben gerade nicht. Dabei geht es ja um Rollen, die eigentlich der Kunde festlegen soll und nicht der Entwickler. Ich könnte natürlich statt Rollen einfach als Key "classname.methodname" eintragen, aber das würde jedes LDAP einer zentralen User-Verwaltung gigantisch aufblähen, da ja alle Permissions aller Anwendungen dort einzeln je User verwaltet werden müssten.

Dieser EJB-Ansatz ist ein rein theoretisches Modell, das für kleine Unternehmen funktioniert oder für Anwendungen, die wirklich nur ganz wenige Rollen haben, die dann schon der Enwickler codieren kann und die auch nicht dynamisch geändert werden müssen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
hdi Zu Reflections & Annotations Allgemeine Java-Themen 10
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
L Annotations um Gültigkeit von Attributen zu definieren? Allgemeine Java-Themen 4
ruutaiokwu junit mit annotations geht nicht? Allgemeine Java-Themen 5
N Method-Annotations in aufgerufener Methode auswerten Allgemeine Java-Themen 2
W Annotations selbst erstellen und auswerten Allgemeine Java-Themen 4
dunhillone Mittels Annotations Methoden "erweitern"? Allgemeine Java-Themen 11
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Landei Annotations ableiten Allgemeine Java-Themen 2
G Annotations. warum ? Allgemeine Java-Themen 9
L Annotations mit Vererbung Allgemeine Java-Themen 4
H eigene Annotations Allgemeine Java-Themen 2
byte Annotations: Arrays auslagern Allgemeine Java-Themen 2
G @Annotations Allgemeine Java-Themen 2
nrg Pfade relativ zur aufrufenden Datei Allgemeine Java-Themen 4
G Ermitteln des aufrufenden Objekts Allgemeine Java-Themen 5
S Methode mit, vom aufrufenden Objekt abhängigen, Rückgabewert Allgemeine Java-Themen 13
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
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben