Reflection: Suche Feld + in Unterklassen

internet

Top Contributor
Hallo,

ich suche eine Möglichkeit beginnend von einer Klasse die Felder nach einem bestimmten Feldname zu suchen.
Ebenfalls sollen die Relationen innerhalb der Klasse berücksichtigt werden.

Also bspw. suche ich nach einem Feld "username":
Wenn ich von der Klasse "Employee" starte, soll eben auch alle Referenzen berücksichtigt werden. Also ebenfalls "User". Dann soll in der Klasse "User" nach "username" gesucht werden.

Wenn ich diese Klasse habe:
Java:
public class Employee {
    private User user;
}

public class User {
    private String username;
}

Wie kann ich das machen? Speziell den Aufruf und Berücksichtigung der "Referenzen".
Wie ich das Feld suchen kann, ist mir durchaus klar:

Code:
Field field = myobject.getClass().getDeclaredField("username");
field.setAccessible(true);
String databaseField = (String) field.get(myobject);
 

KonradN

Super-Moderator
Mitarbeiter
Wo ist denn das genaue Problem?

Du hast doch eigentlich schon alles, was Du brauchst.

Du kannst bei einer Klasse alle Felder (getFields()) holen und diese durchgehen.

Also wenn Du ein Employee hast, dann kannst Du dir alle Felder holen und diese dann durchgehen:
  • gibt es einen "username" -> fertig
  • Wenn es keinen username gab, dann gehst Du die Felder alle durch und holst Dir den Inhalt.
-- Ist der Inhalt null? Dann gehe weiter
-- sonst-> Rekursive Prüfung aufrufen. Hat das ein Ergebnis ergeben? -> fertig

Hier musst Du aber halt die Anforderungen prüfen und gewisse Spezialfälle beachten:
  • Zirkuläre Referenzen / Klassen. Employee hat evtl. einen Boss und der hat auch einen username? Etwas in der Art. Oder ein Feld reportsTo, das auf den Employee selbst zeigt ...
  • Collections und Array wollen evtl. auch speziell behandelt werden
  • ...
 

internet

Top Contributor
irgendwie gehen seit geraumer Zeit bei mir die Benachrichtigung im Forum nicht mehr, aber ein anderes Thema..

Wo ist denn das genaue Problem?

Der Aufruf bzw. Durchgehen beim Feld "User" ist dann aktuell das Problem...
Also hier brauche ich ja irgendwie eine Bedingung, die nicht nur einen Integer, String etc. prüft, sondern wiederum von dieser Klasse..
 

KonradN

Super-Moderator
Mitarbeiter
Den Ablauf hatte ich doch beschrieben. Ich verstehe daher weiter nicht das Problem, das Du hast.

Also einfach mal umgesetzt, wie sowas auf die Schnelle aussehen könnte - ohne jetzt die angesprochen Fälle irgendwie zu berücksichtigen. Und ich habe die Zugriffsrechte auf die Felder sowie das Behandeln der Exception außen vor gelassen.

Java:
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Optional;

public final class ReflectionTest {

    public static class Employee {
        public User user;
    }

    public static class User {
        public String username;
    }

    public static String findUsername(Object obj) throws IllegalAccessException {
        Field[] fields = obj.getClass().getFields();

        Optional<Field> usernameField = Arrays.stream(fields)
                .filter( f -> "username".equals(f.getName()))
                .findAny();

        if (usernameField.isPresent())
            return (String) usernameField.get().get(obj);

        for (Field field : fields) {
            Object fieldContent = field.get(obj);
            if (fieldContent != null) {
                String result = findUsername(fieldContent);
                if (result != null) {
                    return result;
                }
            }
        }
        return null;
    }

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

        Employee employee = new Employee();
        System.out.println("On empty employee: " + findUsername(employee));

        employee.user = new User();
        employee.user.username = "JohnDoe";

        System.out.println("On filled employee: " + findUsername(employee));
    }
}
 

internet

Top Contributor
danke.
Aber wie kann ich auch noch die ganzen vererbten Felder berücksichtigen? Das scheint es aktuell nicht?

Java:
public class User extends UserImpl {
....
}

Im Prinzip möchte ich mir mein SQL (JPA) damit zusammen bauen und suche nach einem bestimmten Feld.
 

KonradN

Super-Moderator
Mitarbeiter
Ich würde Dir raten, doch einmal genauer in die Klassen, die Du benutzt zu schauen.

So gibt es die Methode getSuperclass() - Du kannst also damit also auch die Vererbungshirarchie durchgehen.

Generell ist die Frage aber dennoch, was Du da genau aufbauen willst. Was für ein SQL willst Du genau aufbauen? Im Augenblick klingt das alles etwas dubios. Zumal Du ja nur die Java Klassen durchgehst und Du in SQL ja die Datenbank Feldnamen brauchst und die können abweichen...
 

internet

Top Contributor
ok, dann schweife ich mal näher aus.
Ich habe eine Webapp, das mandantenfähig ist. Demnach habe ich verschiedene Entitäten, die meistens so aufgebaut sind:
CustomerImpl verwende ich aktuell für zwei Entities a) Der Customer selbst b) Eine Log - Tabelle. Daher die Vererbung.

Java:
@Entity
@Table(name = "customer")
public class Customer extends CustomerImpl  {
    
    @Id
    @GeneratedValue(generator = "customer_id_seq", strategy = AUTO)
    @SequenceGenerator(name = "customer_id_seq", sequenceName = "customer_id_seq", allocationSize = 1)
    @Column(name = "customer_id", nullable = false)
    private Long id = NO_ID;
}


@MappedSuperclass
public class CustomerImpl implements Serializable, EntityPropertyFinder, Cloneable {

    // Emailadresse
    @Size(max = Constants.SIZE_MAX_STRING)
    @Column(name = "email", length = Constants.SIZE_MAX_STRING)
    private String email = null;

}

Nun habe ich die verschiedene Entities, wie Invoice, Offer etc.
Ausgenommen Entities für die App selbst (Adminzeugs) haben die irgendwo eine Abhängig zum User.
Meistens eine direkte Verbindung, also

Code:
@ManyToOne(optional = false)
@NotNull
@JoinColumn(name = "user_fk")
 private User user;

Manchmal muss man eben über mehrere Entities gehen, damit man den User bekommt.
Also zB bei InvoicePosition:
-> InvoicePosition -> Invoice -> User

Nun will ich gerne ein SQL bzw. JPA dynamisch aufbauen um auf den User filtern zu können.
"Username" war oben der Einfachheit genannt, prinzipiell brauche ich vom Objekt "User" das Feld "id" um dann im SQL auf den aktuell User, den ich über einen Parameter filtern kann.

Allerdings reicht auch einfach nur der Pfad zum User - Objekt, also bspw. invoice.user...

+ ".id" im String kann ich auch selbst hinzufügen und ich bin flexibler, falls ich auch mal ein anderes Feld vom User brauche.

Hoffe das war verständlich :)
 

LimDul

Top Contributor
Du kannst es so machen - sinnvoll ist es aber nicht.

Wenn man an solche Probleme mit Reflection rangeht, investiert man in der Regel zu viel Zeit und hat am Ende nicht mehr wartbaren und verständlichen Code. Insbesondere weil man zig Sonderfälle (Collections, Zirkuläre Abhängigkeiten) berücksichtigen muss. Performant ist das auch nicht mehr, weil vermutlich jedes Objekt eine mittlere 2 bis 3 stellige Zahl an verlinkten Objekten hat. Wenn man alleine man schaut, was eine ArrayList oder ein String intern selber an Feldern hat - das wird schnell viel. Hinzu kommt Polymorphismus.

Klasse A referenziert Klasse B, aber es gibt eine Ableitung von B - Klasse C. Will man die auch durchtraversieren oder nicht?

Viel sinnvoller ist es, das sauber zu programmieren. JPA hat einen CriteriaBuilder, der für sowas gedacht ist. Spendier zu jeder Entität eine Methode, die für die Entität das User-Select Criteria bastelt. Aufwand pro Entität vermutlich < 5 Minuten. Das ist schneller umgesetzt und wartbarer, als das per Reflection zu lösen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Reflection ändern von Objekten in Objekten Java Basics - Anfänger-Themen 12
G Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?! Java Basics - Anfänger-Themen 11
S reflection und felder Java Basics - Anfänger-Themen 12
B .class-File mit Reflection auslesen Java Basics - Anfänger-Themen 8
X Parameterübergabe per Reflection Java Basics - Anfänger-Themen 10
U Reflection Benutzung Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 6
B Reflection Java Basics - Anfänger-Themen 8
S Datentypen Reflection Cast anhand eines Strings? Java Basics - Anfänger-Themen 7
X reflection api Java Basics - Anfänger-Themen 5
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
lumo java reflection Java Basics - Anfänger-Themen 7
J Reflection Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 3
P Reflection - Class Not Found Exception Java Basics - Anfänger-Themen 3
A Frage zu Reflection Java Basics - Anfänger-Themen 8
A abgeleitete Klassen mit Reflection holen Java Basics - Anfänger-Themen 2
M Reflection Java Basics - Anfänger-Themen 8
W Problem bezüglich reflection Java Basics - Anfänger-Themen 11
S verschiede constructoren über reflection Java Basics - Anfänger-Themen 3
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
JFeel-x Frage zu reflection Java Basics - Anfänger-Themen 12
J Reflection Basic Java Basics - Anfänger-Themen 26
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
T von Reflection zum Thread? Java Basics - Anfänger-Themen 5
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
G Reflection - Klasse laden aus anderem Verzeichnis Java Basics - Anfänger-Themen 4
L Reflection-fehlermeldung Java Basics - Anfänger-Themen 12
E Klassenaufrufe dynamisch mit Reflection Java Basics - Anfänger-Themen 4
S wer oder was ist reflection? Java Basics - Anfänger-Themen 11
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
M Suche Resteasy Example Java Basics - Anfänger-Themen 24
B Beliebiger String gegeben Suche Datum in String Java Basics - Anfänger-Themen 6
M binäre Suche im Intervall Java Basics - Anfänger-Themen 6
M binäre Suche Java Basics - Anfänger-Themen 4
H Suche Java3D 32 bit Java Basics - Anfänger-Themen 20
amelie123456 Lineare Suche / Binäre Suche Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
K Warum ist die binäre Suche bei der verketteten Liste nicht so effektiv? Java Basics - Anfänger-Themen 3
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
RudiRüssel Binäre Suche, unsortiert, lokales Maximum Java Basics - Anfänger-Themen 15
Y Suche von Studenten anhand Ihrer Eigenschaften. Java Basics - Anfänger-Themen 1
F Auf der Suche in π Java Basics - Anfänger-Themen 13
C Suche Nachhilfe in Java Java Basics - Anfänger-Themen 5
T Binärbaum-Suche Implementation Java Basics - Anfänger-Themen 6
A suche dringend Hilfe!! Java Basics - Anfänger-Themen 6
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
B Suche free SVN Hosting Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
S Java Lineare-Suche Zeitmessung Java Basics - Anfänger-Themen 5
S Java Lineare Suche Java Basics - Anfänger-Themen 1
S Binäre-Suche bei unsortierten Daten Java Basics - Anfänger-Themen 7
E Die richtige Suche in der API Java Basics - Anfänger-Themen 1
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
B Suche Programme mit Fehlern Java Basics - Anfänger-Themen 9
jaleda100 Component für Suche Java Basics - Anfänger-Themen 4
L Suche ein sampel Projekt Java Basics - Anfänger-Themen 2
P Suche Aufwandsgenerator (o-notation) Java Basics - Anfänger-Themen 1
S Suche aktuelles 2D Grafik Tutorial Java Basics - Anfänger-Themen 5
M Suche hilfe bei Array Java Basics - Anfänger-Themen 4
L Binäre Suche mit Comparator Java Basics - Anfänger-Themen 5
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
D Ich suche nach einer Möglickeit den Webseiten Inhalt per Java zu analysieren Automatisch Java Basics - Anfänger-Themen 3
B String: suche nach Wörter und in List<String> speichern Java Basics - Anfänger-Themen 3
D Erste Schritte Suche Quelltext Java Basics - Anfänger-Themen 7
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Suche Hilfestellung Java Basics - Anfänger-Themen 10
G Erste Schritte Suche Java Programmierer für kleines Projekt Java Basics - Anfänger-Themen 1
J Suche die Emailadresse Java Basics - Anfänger-Themen 6
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
H Erste Schritte Binäre Suche Java Basics - Anfänger-Themen 37
J Suche simples Beispiel für die EOFException Java Basics - Anfänger-Themen 1
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
L Binäre Suche Java Basics - Anfänger-Themen 2
L Linerae Suche in einem sortierten Array Java Basics - Anfänger-Themen 2
N Array, lineare Suche, binäre Suche, Programm bleibt unerwartet stehen... Java Basics - Anfänger-Themen 6
I Innerhalb einer Methode suchen und hinzufügen. Neues Objekt in Suche dann? Java Basics - Anfänger-Themen 8
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
L Einfache Lineare Suche Java Basics - Anfänger-Themen 7
J Binäre Suche eines Array Java Basics - Anfänger-Themen 5
M Methoden Binäre Suche als rekursive Variante Java Basics - Anfänger-Themen 5
D Suche nach der Anzahl von Zonen zwischen zwei Punkten Java Basics - Anfänger-Themen 2
M Benutzerdefinierte Suche in einem String - outofbounds Java Basics - Anfänger-Themen 7
X Best Practice SUCHE ein gutes Javabuch! (kein Anfang von 0) Java Basics - Anfänger-Themen 5
B Binäre Suche in einem String Array Java Basics - Anfänger-Themen 10
A Heap Space Error bei rekursiver Suche in Dateien trotz nur einer Zeile im Speicher Java Basics - Anfänger-Themen 26
M Rekursive Suche in einem Feld Java Basics - Anfänger-Themen 11
S Suche richtigen Typ für Variabel mit den Werten (neu, gebraucht, beschädigt) Java Basics - Anfänger-Themen 7
M Best Practice Programmierstil Graphen-A*-Suche Java Basics - Anfänger-Themen 5
M Suche Hilfe bei sehr kleinen Quelltexten Java Basics - Anfänger-Themen 2
E Suche Klasse die eine Bedinung prüft und einen von zwei Auswahlwerten zurückgibt... Java Basics - Anfänger-Themen 6
D Erste Schritte suche hilfe für db-anbindung Java Basics - Anfänger-Themen 36
S Java Servlet - Suche Java Basics - Anfänger-Themen 1
P Hashing suche Java Basics - Anfänger-Themen 4
K Suche Hilfe bei einfachem Java Code ( Debuggen ) Java Basics - Anfänger-Themen 1
J Variablen Auf der suche nach einem Befehl Java Basics - Anfänger-Themen 2
M Binäre Suche Fehler überall =( Java Basics - Anfänger-Themen 2
Farbenfroh Suche Übungsaufgaben: BinaryTree, Stack Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben