web-dev-qa-db-fra.com

NoSuchFieldException quand le champ existe

Je reçois un Java.lang.NoSuchFieldException En essayant d'exécuter la méthode suivante:

 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); }

L'erreur est sur la ligne Time startTime = (Time)t.getClass().getField(day + "Start").get(t);

Je ne comprends pas cette erreur, car monStart est un champ de la classe Tutor:

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;

J'apprends juste à utiliser la réflexion, alors je suis sûr que c'est une sorte d'erreur de syntaxe ...

63
awqueous

La méthode getField ne trouvera le champ que s'il s'agit de public. Vous devrez plutôt utiliser la méthode getDeclaredField , qui trouvera tout champ déclaré directement sur la classe, même si ce n'est pas public.

145
rgettman

Selon le javadoc, Class.getField() "renvoie un objet Field qui reflète le champ membre public spécifié de la classe ou de l'interface représentée par cet objet Class" ". Utilisez getDeclaredField() si vous souhaitez accéder à des champs non publics.

11
Costi Ciudatu

Les meilleures solutions pour le problème getClass().getField() sont:

Utilisez getDeclaredField () au lieu de getField ()

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

2) Remplacez "HelloWorld" par le nom de votre classe

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

Si vous voulez obtenir la longueur d'annotation de la colonne

HelloWorld.class.getDeclaredField(propertyName).getAnnotation(Column.class).length()

Je suis venu à cette question basée sur le titre. J'obtenais la même erreur (NoSuchFieldException) dans mon Android projet) mais pour une raison différente.

Donc, pour les autres personnes qui viennent ici, cette erreur peut aussi être potentiellement causée par la désynchronisation des caches dans Android Studio. Accédez à Fichier> Invalider les caches/Redémarrer ...

Voir this aussi

1
Suragch

Pour tout Android qui voient cela ne semblent toujours pas résoudre le problème, vérifiez si Proguard est activé. Si c'est le cas, il est possible que la classe en la question est obscurcie et vous devrez ajouter des règles pour empêcher que cela ne se produise.

0
Brian Yencho