NoSuchFieldException, wenn Feld vorhanden ist

75

Ich erhalte eine, java.lang.NoSuchFieldExceptionwenn ich versuche, die folgende Methode auszuführen:

 public void getTimes(String specialty, String day) {
    ArrayList<Tutor> withSpec = new ArrayList<Tutor>();
    for (Tutor t : tutorList){
        try {
            Time startTime = (Time)t.getClass().getField(day + "Start").get(t);
        } catch (NoSuchFieldException | SecurityException | IllegalAccessException ex) Logger.getLogger(DBHandler.class.getName()).log(Level.SEVERE, null, ex); }

Der Fehler liegt in der Leitung Time startTime = (Time)t.getClass().getField(day + "Start").get(t);

Ich verstehe diesen Fehler nicht, da monStart ein Feld der TutorKlasse ist:

Public class Tutor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "tutorID")
private Integer tutorID;

.... 

@Column(name = "monStart")
@Temporal(TemporalType.TIME)
 Date monStart;

Ich lerne gerade den Umgang mit Reflexion, daher bin ich mir sicher, dass dies eine Art syntaktischer Fehler ist ...

zog moore
quelle
Hat es deine App zum Absturz gebracht?
IgorGanapolsky

Antworten:

157

Die getFieldMethode findet das Feld nur, wenn es ist public. Sie müssen getDeclaredFieldstattdessen die Methode verwenden, die jedes Feld findet, das direkt in der Klasse deklariert ist , auch wenn dies nicht der Fall ist public.

rgettman
quelle
Selbst nach der Verwendung von getDeclaredField über getField wird der folgende Fehler angezeigt: - Ich kann nicht auf ein Mitglied der Klasse mit den Modifikatoren "privat" zugreifen.
Subodh
10
Ohh, verstehe. Ich muss setAccessible (true)
Subodh
3
Ich bekomme NoSuchFieldExceptionsogar bei der Verwendung getDeclaredField(), und der Fehler "hat privaten Zugriff" auch nach der Verwendung setAccessible(true). Beispiel 1 : Field fieldy = rootElement.getClass().getDeclaredField("name");Würfe NoSuchFieldException. Dadurch Field[] fields = rootElement.getClass().getDeclaredFields();kann ich die Felder durchlaufen, und wenn ich aufrufe field.getName(), wird "name" zurückgegeben. Also, was ist der Deal?
Joe Flack
1
Gelöst : Sieht so aus, als müsste ich einen Versuch / Fang einwickeln
Joe Flack
12

Laut javadoc Class.getField()"gibt ein FieldObjekt zurück, das das angegebene öffentliche Mitgliedsfeld der Klasse oder Schnittstelle widerspiegelt, die von diesem ClassObjekt dargestellt wird". Verwenden getDeclaredField()Sie diese Option, wenn Sie auf nicht öffentliche Felder zugreifen möchten.

Costi Ciudatu
quelle
8

Die besten getClass().getField()Problemlösungen sind:

Verwenden Sie getDeclaredField () anstelle von getField ()

1)  String propertyName = "test";
    Class.forName(this.getClass().getName()).getDeclaredField(propertyName);

2) Ersetzen Sie "HelloWorld" durch Ihren Klassennamen

    String propertyName = "name";
    HelloWorld.class.getDeclaredField(propertyName)

Wenn Sie die Anmerkungslänge der Spalte erhalten möchten

HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length()
Murali Krishna Valluri
quelle
2

Ich bin auf diese Frage aufgrund des Titels gekommen. Ich habe den gleichen Fehler ( NoSuchFieldException) in meinem Android-Projekt erhalten, aber aus einem anderen Grund.

Für andere, die hierher kommen, kann dieser Fehler möglicherweise auch dadurch verursacht werden, dass die Caches in Android Studio nicht mehr synchron sind. Gehen Sie zu Datei> Caches ungültig machen / neu starten ...

Sehen Sie dies auch

Suragch
quelle
1

Überprüfen Sie, ob Proguard aktiviert ist, wenn Android-Entwickler dies sehen, die das Problem immer noch nicht beheben können . Wenn dies der Fall ist, wird die betreffende Klasse möglicherweise verschleiert, und Sie müssen Regeln hinzufügen, um dies zu verhindern.

Brian Yencho
quelle