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