Annotationswerte sortieren

innoc

Aktives Mitglied
Ich habe folgende Frage: Gibt es eine einfache Möglichkeit die Werte von Methodenannotationen zu sortieren?
Konkret möchte ich bei dem folgenden Programmfragment gerne den Rückgabewert der mit dem Argument value annotierten Methoden in der Zielklasse entsprechend dem lexikographischen Wert von value geordnet via Reflection auflisten.
Hat da jemand eine Idee?

Hier der Programmausschnitt:
Java:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Safe$Wert {
  String value(); // <---- auf diesem Wert soll die Sortierung erfolgen
}

public class InstantiateClass {

  public static void main (String[] args) throws Exception {

    Class targetClass = Class.forName(args[0]);

    Method[] declaredMethods = targetClass.getDeclaredMethods();

   .....
 
S

SlaterB

Gast
> der mit dem Argument value annotierten Methoden

value ist hier der 'Name' der Methode?!

> entsprechend dem lexikographischen Wert von value geordnet
wie wo was häh?
geordnet verlangt mehrere Dinge, gib doch einfach ein Beispiel..

sollen mehrere Methoden einer Klasse nach deren Namen sortiert werden?
dann sortiere das Method[]-Array welches du schon hast, evtl. mit Comparator (nicht bekannt? -> dazu einlesen)

sollen mehrere Methoden einer Klasse nach dem String-Rückgabewert bei testweisen Aufruf sortiert werden?
dann rufe alle Methoden auf, sammle die Rückgabewerte, stecke sie in bestimmte Container zusammen mit Methodenname,
sortierte diese Objekte (in einem Array oder einer Liste) nach dem Rückgabewert, extrahiert am Ende wieder die Methodennamen

du willst das ganz nur fertig in einem API-Aufruf? da kann ich persönlich leider nix nennen
 

innoc

Aktives Mitglied
OK das war vielleicht etwas zu wenig an Info.
Anbei die gesamte Klasse:
Java:
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.AnnotatedElement;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Safe$Wert {
  String value();
}

public class InstantiateClass {

  public static void main (String[] args) throws Exception {

    Class targetClass = Class.forName(args[0]);

    Method[] declaredMethods = targetClass.getDeclaredMethods();


    System.out.println("-------------------------------");

    System.out.println("Listing of declared methods in " + targetClass + " :");
    System.out.println(">> Method names of actual class with fully qualified parameter, exception and return types");

    for (int i = 0; i < declaredMethods.length; i++) {
      Object obj = targetClass.newInstance();
      System.out.println(declaredMethods[i].toString());
      System.out.println("decl class : " + declaredMethods[i].getDeclaringClass());
      Class evec[] = declaredMethods[i].getExceptionTypes();
      for (int j = 0; j < evec.length; j++) {
        System.out.println(" exc #" + j + " " + evec[j]);
      }
      System.out.println("return type : " + declaredMethods[i].getReturnType());
      declaredMethods[i].setAccessible(true);
      Class pvec[] = declaredMethods[i].getParameterTypes();
      if (pvec.length == 0) {
        System.out.println("return value is : " + declaredMethods[i].invoke(obj, new Object[0]));
      } else {
        System.out.println("method needs an argument");
        for (int j = 0; j < pvec.length; j++) {
          System.out.println(" param #" + j + " " + pvec[j]);
          System.out.println("return value is : " + declaredMethods[i].invoke(obj, new Object[1].toString()));
        }
      }
      Annotation[] annotations = declaredMethods[i].getDeclaredAnnotations();
      for (Annotation annotation : annotations) {
        System.out.println("annotation type : " + annotation.annotationType().getName());
        System.out.println("annotation value : " + annotation.toString());
      } 
      System.out.println("************");
    }
    System.out.println("-------------------------------");

    for (int i = 0; i < declaredMethods.length; i++) {
      Annotation[] annotations = declaredMethods[i].getDeclaredAnnotations();
      for (Annotation annotation : annotations) {
        Safe$Wert val = declaredMethods[i].getAnnotation(Safe$Wert.class);
        System.out.print(val.value() + " ");
      }
    }

    System.out.println("");
    System.out.println("-------------------------------");

  }

}

Das liefert auf die Zielklasse angewendet, die folgende Ausgabe:

Listing of declared methods in class Safe :
>> Method names of actual class with fully qualified parameter, exception and return types
private static java.lang.String Safe.m1()
decl class : class Safe
return type : class java.lang.String
return value is : a
annotation type : Safe$Wert
annotation value : @Safe$Wert(value=10)
************
private static java.lang.String Safe.m2()
decl class : class Safe
return type : class java.lang.String
return value is : d
annotation type : Safe$Wert
annotation value : @Safe$Wert(value=1)
************
private static java.lang.String Safe.m3()
decl class : class Safe
return type : class java.lang.String
return value is : d
annotation type : Safe$Wert
annotation value : @Safe$Wert(value=7)
************
private static java.lang.String Safe.m4()
decl class : class Safe
return type : class java.lang.String
return value is : e
annotation type : Safe$Wert
annotation value : @Safe$Wert(value=3)

Nun sollen die Ausgabe-Werte (return value) nach dem annotation value aufsteigend sortiert werden.
Ich glaube ein Comparator ist da ein richtiger Ansatz. Nur wo muss der Comparator eingefügt werden, in @interface?
Ich hoffe, das macht die Sache etwas klarer.
 
S

SlaterB

Gast
ich verstehe es noch nicht unbedingt, aber ist letztlich egal,

von mir nochmal der handwerkliche Vorschlag, irgendeine automatische Zauber-Sortierung kann ich nicht nennen, was nicht heißen soll dass sie nicht vielleicht existiert,
also manuell:
du hast da in einer Schleife mehrere Ausgabeabschnitte, jeweils mit einer Menge von Strings, auf irgendeine Weise über Reflection bestimmt,
wie schon gesagt: sammle diese zusammengehörigen Informationen, ruhig in einer neuen Klasse mit 2-10 String attributen, was immer du brauchst,
eines der Objekte hat dann 'e' und '@Safe$Wert(value=3)' und weitere Strings, vielleicht die Zahl 3 gleich aus dem String extrahieren wenn nötig,

diese Objekte kommen alle in eine Liste oder ein Array und werden sortiert, bei eigener Klasse kannst du gleich Comparable richtig implementieren, sonst auch Comparator,
wie Sortieren mit Comparable und Co. grundsätzlich funktioniert ist ein Standardkapitel in jedem Lehrbuch, das möchte ich nicht erklären,
sofern du nicht konkrete Fragen hast a la 'bei mir läuft folgender Code mit Comparator und folgender Eingabe, wieso ist Wert x hier vor Wert y es müsste doch .. gelten?'

um eins zumindest klarzustellen:
> Nur wo muss der Comparator eingefügt werden, in @interface?
nein, bei der Sortierung, komplett unabhängig von den Klassen
 

innoc

Aktives Mitglied
OK habs nun so umgesetzt, wie SlaterB es vorgeschlagen hat. Anbei meine Lösung:

Java:
import java.util.TreeMap;
import java.util.SortedMap;

import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.AnnotatedElement;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Safe$Wert {
  String value();
}

public class InstantiateClass {

  public static void main (String[] args) throws Exception {

    SortedMap<Integer, Object> map = new TreeMap<Integer, Object>();

    Class targetClass = Class.forName(args[0]);
    Object obj = targetClass.newInstance();


    Method[] declaredMethods = targetClass.getDeclaredMethods();


    System.out.println("Listing of declared methods in " + targetClass + " :");
    System.out.println(">> Method names of actual class with fully qualified parameter, exception and return types <<");

    for (int i = 0; i < declaredMethods.length; i++) {
      System.out.println("  " + declaredMethods[i].toString());
      System.out.println("  decl class : " + declaredMethods[i].getDeclaringClass());
      Class evec[] = declaredMethods[i].getExceptionTypes();
      for (int j = 0; j < evec.length; j++) {
        System.out.println("  exc #" + j + " " + evec[j]);
      }
      System.out.println("  return type : " + declaredMethods[i].getReturnType());
      declaredMethods[i].setAccessible(true);
      Class pvec[] = declaredMethods[i].getParameterTypes();
      if (pvec.length == 0) {
        System.out.println("  return value is : " + declaredMethods[i].invoke(obj, new Object[0]));
      } else {
        for (int j = 0; j < pvec.length; j++) {
          System.out.println("    This method requires the following arguments");
          System.out.println("    param #" + (j+1) + " --> " + pvec[j]);
        }
      }
      Annotation[] annotations = declaredMethods[i].getDeclaredAnnotations();
      for (Annotation annotation : annotations) {
        System.out.println("  annotation value : " + annotation.toString());
      } 
      System.out.println("************");
    }
    System.out.println("-------------------------------");

    for (int i = 0; i < declaredMethods.length; i++) {
      Annotation[] annotations = declaredMethods[i].getDeclaredAnnotations();
      for (Annotation annotation : annotations) {
        Safe$Wert key = declaredMethods[i].getAnnotation(Safe$Wert.class);
        Object val = declaredMethods[i].invoke(obj, new Object[0]);
        try {
          map.put(Integer.parseInt(key.value()), val);
        } catch(Exception ex) {}
      }
    }

    System.out.println("Ascending order of Annotation values : ");
    for (Object elem : map.values()) {
      System.out.print(elem + " ");
    }

    System.out.println("");
    System.out.println("-------------------------------");

  }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J JTable mehrere Spalten sortieren Java Basics - Anfänger-Themen 31
G Mehrere Spalten mit Comparator sortieren Java Basics - Anfänger-Themen 2
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
S Daten aus Import Datei auslesen und sortieren Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
O Sortieren mit Insertion Sort Java Basics - Anfänger-Themen 3
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Jambolo Karten sortieren nach Rang und Farbe Java Basics - Anfänger-Themen 5
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
K verschiedene Eingaben sortieren Java Basics - Anfänger-Themen 6
G zweidimensionales int Array sortieren Java Basics - Anfänger-Themen 57
K Java sortieren. Java Basics - Anfänger-Themen 7
D Array Elemente sortieren in aufsteigender Reihenfolge Java Basics - Anfänger-Themen 10
J Tabelle Sortieren Java Basics - Anfänger-Themen 48
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
L Sortieren Java Basics - Anfänger-Themen 1
C Wie 2 Arrays zusammenfügen und sortieren? Java Basics - Anfänger-Themen 11
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
O 2D-Array nach einer Spalte sortieren Java Basics - Anfänger-Themen 22
C Sortieren einer ArrayList Java Basics - Anfänger-Themen 2
A Teilarrays eines 2D-Arrays sortieren Java Basics - Anfänger-Themen 4
JD_1998 Random Array sortieren mit Hilfe einer Methode Java Basics - Anfänger-Themen 4
java3690 eine liste sortieren Java Basics - Anfänger-Themen 12
DorFey Sortieren eines mehrdimensionalen Arrays Java Basics - Anfänger-Themen 8
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
W Personen sortieren mit Comparator Java Basics - Anfänger-Themen 9
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
S Streams - Abfrage absteigend sortieren Java Basics - Anfänger-Themen 11
V Collections ArrayList mit Comparator sortieren Java Basics - Anfänger-Themen 16
V Collections int Werte in einer Liste sortieren Java Basics - Anfänger-Themen 23
L Array sortieren Java Basics - Anfänger-Themen 4
L Java Int-Array, Zahlen sortieren Java Basics - Anfänger-Themen 8
T Java: Array monat absteigend sortieren? Java Basics - Anfänger-Themen 1
B Liste sortieren? Java Basics - Anfänger-Themen 4
P Array Sortieren mit boolean? Java Basics - Anfänger-Themen 33
scratchy1 Array sortieren und dann String-Repräsentation ausgeben Java Basics - Anfänger-Themen 2
O Arrays sortieren in einer Methode Java Basics - Anfänger-Themen 2
E Methoden 2 Arrays sortieren (MergeSort) Java Basics - Anfänger-Themen 3
B Suchen und sortieren Java Basics - Anfänger-Themen 10
F Zahlen im Feld sortieren + Unterprogramm Java Basics - Anfänger-Themen 4
O Zweidimensional Array sortieren Java Basics - Anfänger-Themen 14
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
CptK Variablen Teile eines Arrays zufällig sortieren Java Basics - Anfänger-Themen 7
K Methoden Array[][] sortieren Java Basics - Anfänger-Themen 30
CptK Datentypen Integer ArrayList sortieren Java Basics - Anfänger-Themen 2
E ArrayList sortieren Java Basics - Anfänger-Themen 16
L Methode zum sortieren Java Basics - Anfänger-Themen 1
L Methode zum sortieren Java Basics - Anfänger-Themen 1
B Sortieren mit Iterator Java Basics - Anfänger-Themen 4
B Wie kann ich die Buchstaben sortieren nach der Höhe der Zahlen Java Basics - Anfänger-Themen 14
A Sortieren ausgerechneter Werte aus einer TXT Datei Java Basics - Anfänger-Themen 8
E LMC (Assembler) Sortieren von 3 Zahlen Java Basics - Anfänger-Themen 4
J String, Int und double Array sortieren Java Basics - Anfänger-Themen 16
F Liste nach einer Variablen sortieren Java Basics - Anfänger-Themen 6
A Array sortieren Java Basics - Anfänger-Themen 1
N StringArray alphabetisch sortieren Java Basics - Anfänger-Themen 4
Tommy135 Erste Schritte JavaDoc Sortieren Java Basics - Anfänger-Themen 5
R Winkel berechnen bzw. Geraden sortieren Java Basics - Anfänger-Themen 33
L (Integer) Liste nach aufsteigender Summe der Ziffern sortieren (mit Bedingung) Java Basics - Anfänger-Themen 8
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
D Arraylisten sortieren bitte um Hilfe Java Basics - Anfänger-Themen 4
informatikschüler21 String im Array sortieren Java Basics - Anfänger-Themen 4
U Methoden Zweidimensionales Array mit Arrays.sort sortieren? Java Basics - Anfänger-Themen 22
M Arrays sortieren und kleinster Abstand Java Basics - Anfänger-Themen 3
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
N TreeMap alphabetisch sortieren? Java Basics - Anfänger-Themen 3
I <List> sortieren Java Basics - Anfänger-Themen 2
F Interface Nach mehreren Kriterien sortieren Java Basics - Anfänger-Themen 2
R Objekte Vergleichen und Sortieren Java Basics - Anfänger-Themen 3
I Sortieren nach Priorität Java Basics - Anfänger-Themen 3
S List<T<X,Y> sortieren Java Basics - Anfänger-Themen 5
W Array sortieren Java Basics - Anfänger-Themen 3
C JList Einträge nach Datum sortieren Java Basics - Anfänger-Themen 3
Alex/89 Werte einer .txt Datei sortieren Java Basics - Anfänger-Themen 8
N Bubble Sort sortieren mit Int Werte Java Basics - Anfänger-Themen 8
N Collection sortieren/ filtern Java Basics - Anfänger-Themen 7
C Methoden Einfach verkette Liste - int Werte aufsteigend sortieren Java Basics - Anfänger-Themen 1
P Listen sortieren mit Binärbaum gibt keine Ausgabe ab 10000 Integern Java Basics - Anfänger-Themen 14
S array sortieren Java Basics - Anfänger-Themen 7
D Array mit Zufallszahlen, dann sortieren: Hilfe gesucht! Java Basics - Anfänger-Themen 1
D Methoden int-Array absteigend sortieren Java Basics - Anfänger-Themen 8
C Chars in einem String alphabetisch sortieren Java Basics - Anfänger-Themen 1
C OOP array Sortieren ohne den sort Befehl Java Basics - Anfänger-Themen 10
S int-Array mittels Arrays.sort() in einer Schleife sortieren. Java Basics - Anfänger-Themen 2
J Sortieren Java Basics - Anfänger-Themen 21
O Erste Schritte TreeMap nach Value sortieren Java Basics - Anfänger-Themen 2
K Collections Sortieren nach zweiter Spalte in JTable Java Basics - Anfänger-Themen 18
H Strings vergleichen & sortieren Java Basics - Anfänger-Themen 20
J Ungewolltes Sortieren eines Arrays Java Basics - Anfänger-Themen 4
T Collections Sortieren von Automodellen (v.a. BMW und Mercedes) Java Basics - Anfänger-Themen 3
P Liste sortieren verschiedener generischer Typen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben