Datentypen Deklarierte Felder einer Generic Klasse bestimmen

lam_tr

Top Contributor
Guten morgen zusammen,

ich stehe mal wieder vor einem Problem, bei der ich nicht genau weiß ob es so überhaupt geht, oder einfach syntaktisch falsch angehe.

Ich habe eine ColumnMapper mit Generic Type T. T soll einfach eine Pojo Datenklasse sein. Kann ich zur Laufzeit alle deklarierten Felder von T im Konstruktur von der ColumnMapper bestimmen?

Sinn der Sache ist mit Hilfe einer Pojo die Columns zu erstellen.

Java:
public class ColumnMapper<T> {

    public static class Person {
        private String name;
        private String firstname;
        private String lastname;
    }

    public ColumnMapper() {
        // Ich suche an der Stelle die Felder von T
        Field[] fields = T.getDeclaredFields();
        for (Field field : fields) {
           // createColumn(field.getName());
        }
    }

    public static void main(String[] args) {
        ColumnMapper<Person> columMapper= new ColumnMapper<>();
    }
}

Viele Grüße
lam
 
Stichwort "Super Type Token":
Java:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
public abstract class ColumnMapper<T> {
  public static class Person {
    private String name;
    private String firstname;
    private String lastname;
  }
  public ColumnMapper() {
    // Ich suche an der Stelle die Felder von T
    ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
    Class<?> typeArgument = (Class<?>) pt.getActualTypeArguments()[0];
    Field[] fields = typeArgument.getDeclaredFields();
    for (Field field : fields) {
      System.out.println(field.getName());
    }
  }
  public static void main(String[] args) {
    ColumnMapper<Person> columMapper = new ColumnMapper<Person>(){};
  }
}
Siehe auch verwandten Post: https://www.java-forum.org/thema/wildcard-und-class-type.189656/
 
Stichwort "Super Type Token":
Java:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
public abstract class ColumnMapper<T> {
  public static class Person {
    private String name;
    private String firstname;
    private String lastname;
  }
  public ColumnMapper() {
    // Ich suche an der Stelle die Felder von T
    ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
    Class<?> typeArgument = (Class<?>) pt.getActualTypeArguments()[0];
    Field[] fields = typeArgument.getDeclaredFields();
    for (Field field : fields) {
      System.out.println(field.getName());
    }
  }
  public static void main(String[] args) {
    ColumnMapper<Person> columMapper = new ColumnMapper<Person>(){};
  }
}
Siehe auch verwandten Post: https://www.java-forum.org/thema/wildcard-und-class-type.189656/
Das habe ich gestern in einigen Beispielen auch schon gesehen
Java:
this.getClass().getGenericSuperclass();
aber der Aufruf hatte mich etwas verwirrt. GernericSuperclass hört sich ein bisschen nach Basisklasse an. Das Model Person leitet aber von keiner klasse. So wie es aussieht, klappts, Danke!
 
Das habe ich gestern in einigen Beispielen auch schon gesehen
Java:
this.getClass().getGenericSuperclass();
aber der Aufruf hatte mich etwas verwirrt. GernericSuperclass hört sich ein bisschen nach Basisklasse an. Das Model Person leitet aber von keiner klasse. So wie es aussieht, klappts, Danke!
Person nicht. Aber dein erzeugter ColumnMapper ist eine Anonyme Klasse, die von der abstrakten ColumnMapper Klasse ableitet.
 
Person nicht. Aber dein erzeugter ColumnMapper ist eine Anonyme Klasse, die von der abstrakten ColumnMapper Klasse ableitet.
Ich habe das mit dem "abstract" komplett überlesen, jetzt ist alles klar. Das ist echt Mega Tricky.

Und wie kann ich es richtig machen, wenn ich eine abgeleitete Klasse davon erzeuge?

Java:
public class BaseColumnMapper<T> {

    public BaseColumnMapper() {
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        Class<?> typeArgument = (Class<?>) pt.getActualTypeArguments()[0];
        Field[] fields = typeArgument.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }
    }

    public static class ColumnMapper<S> extends BaseColumnMapper<S> {
    }

    public static void main(String[] args) {
        ColumnMapper<Person> columMapper = new ColumnMapper<>();
    }
}

Dann bekomme ich diesen StackTrace
Java:
Exception in thread "main" java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

Warum klappt das mit der abstrakten Klasse aber mit der Abgeleiteten nicht?
 

Zurück
Oben