reflexion reflect method example ejemplos java reflection

method - reflection java stack overflow



NoSuchFieldException cuando existe campo (4)

java.lang.NoSuchFieldException una java.lang.NoSuchFieldException cuando intento ejecutar el siguiente método:

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

El error está en la línea Time startTime = (Time)t.getClass().getField(day + "Start").get(t);

No entiendo este error, porque monStart es un campo de la clase 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;

Estoy aprendiendo a usar la reflexión, así que estoy seguro de que esto es un tipo de error sintáctico ...


De acuerdo con javadoc, Class.getField() "Devuelve un objeto Field que refleja el campo de miembro público especificado de la clase o interfaz representada por este objeto Class ". Utilice getDeclaredField() si desea acceder a campos no públicos.


El método getField solo encontrará el campo si es public . En su lugar, deberá utilizar el método getDeclaredField , que encontrará cualquier campo que se declare directamente en la clase, incluso si no es public .


Las mejores soluciones para el problema getClass().getField() son:

Use getDeclaredField () en lugar de getField ()

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

2) Reemplaza "HelloWorld" con tu nombre de clase

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

Si desea obtener la longitud de anotación de la columna

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


Llegué a esta pregunta en base al título. NoSuchFieldException el mismo error ( NoSuchFieldException ) en mi proyecto de Android pero por un motivo diferente.

Entonces, para otros que vienen aquí, este error también puede ser causado por las cachés que se salgan de la sincronización en Android Studio. Vaya a Archivo> Invalidar caches / reiniciar ...

Ver this también