Ich erhalte eine, java.lang.NoSuchFieldException
wenn 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 Tutor
Klasse 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 ...
java
reflection
zog moore
quelle
quelle
Antworten:
Die
getField
Methode findet das Feld nur, wenn es istpublic
. Sie müssengetDeclaredField
stattdessen die Methode verwenden, die jedes Feld findet, das direkt in der Klasse deklariert ist , auch wenn dies nicht der Fall istpublic
.quelle
NoSuchFieldException
sogar bei der VerwendunggetDeclaredField()
, und der Fehler "hat privaten Zugriff" auch nach der VerwendungsetAccessible(true)
. Beispiel 1 :Field fieldy = rootElement.getClass().getDeclaredField("name");
WürfeNoSuchFieldException
. DadurchField[] fields = rootElement.getClass().getDeclaredFields();
kann ich die Felder durchlaufen, und wenn ich aufrufefield.getName()
, wird "name" zurückgegeben. Also, was ist der Deal?Laut javadoc
Class.getField()
"gibt einField
Objekt zurück, das das angegebene öffentliche Mitgliedsfeld der Klasse oder Schnittstelle widerspiegelt, die von diesemClass
Objekt dargestellt wird". VerwendengetDeclaredField()
Sie diese Option, wenn Sie auf nicht öffentliche Felder zugreifen möchten.quelle
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
quelle
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
quelle
Ü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.
quelle