Android Java objModelClass.getClass (). GetDeclaredFields () devuelve "$ change" como un campo

En nuestro proyecto estamos utilizando modelos de datos para almacenar los datos recibidos de los servicios. Así que en un caso particular cuando estamos insertando datos en la base de datos, utilizamos el método objModelClass.getClass (). GetDeclaredFields () para obtener todos los nombres de campo y devuelve correctamente todos los nombres de campo de la clase pero también devuelve un campo extra con nombre "$ Change", que no existe en la clase.

Lo extraño es, en el estudio de Android no había tal problema, pero cuando actualizamos a android studio 2.0 esto sucedió.

Aunque he aplicado una solución rápida, pero tengo que solucionar correctamente esto. Quiero saber el por qué está sucediendo?

Esta es la función que utiliza este método

public void insertValuesIntoTable(final String strTableName, ArrayList<Object> alObjClasses, String strPrimaryKey, String strCompositeKey) { try { SQLiteDatabase db_w = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); //Iterate through every model class Object in the ArrayList and transfer the contents to the DB if (alObjClasses != null) for (Object objModelClass : alObjClasses) { for (Field field : objModelClass.getClass().getDeclaredFields()) { //Encrypt value if encryption is enabled & the column is to be encrypted try { field.setAccessible(true); //Test if the table received is Ignore contacts. Minor Hack inserted //So that the same contact data model can be re used. It checks if the //Table is of ignored constant or not then checks if the column exists //in the table or not as that of the field name. Doing this saves //from receiving a SQLConstraint exception stating, "Column not found" if(field.getName().equals("$change")) continue; if(strTableName.equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS)) if(!field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_NAMES) && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_NUMBERS) && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_EMAIL) && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_CITY) && !field.getName().equalsIgnoreCase(ContactConstants.TABLE_IGNORED_CONTACTS_ID)) continue; contentValues.put(field.getName(), (Constants.ENCRYPTION_PREFERENCE && HelperFunctions.isColumnEncrypted(field.getName())) ? HelperFunctions.encryptString((String) field.get(objModelClass)) : (String) field.get(objModelClass)); } catch (IllegalAccessException e) { // e.printStackTrace(); //Never thrown since field.setAccessible(true); is called before accessing data } catch ( ClassCastException e) { // e.printStackTrace(); //Never thrown since field.setAccessible(true); is called before accessing data } } try { if (db_w.insert(strTableName, null, contentValues) == -1) throw new SQLiteConstraintException(); } catch (SQLiteConstraintException e) { // e.printStackTrace(); Log.i("Error - DB", "Error occurred while trying to add data to " + strTableName + " Table, updating data instead."); //Since the entry exists in the DB, it will be updated instead updateEntryInDatabase(db_w, strTableName, strPrimaryKey, strCompositeKey, contentValues); } } db_w.close(); } catch (NullPointerException e) { // e.printStackTrace(); //Is thrown sometimes when the context of the activity which called it is destroyed mid execution } catch (SQLiteException e) { // e.printStackTrace(); //Is thrown sometimes when the context of the activity which called it is destroyed mid execution } } 

Estoy luchando con este tema desde esta mañana. Es debido a la nueva funcionalidad de Android Studio 2, Instant run, que agrega este campo en alguna parte, como puede verse durante la depuración: implementa la interfaz com.android.tools.fd.runtime.IncrementalChange .

Este problema puede resolverse comprobando el campo usando el método isSynthetic() : devolverá true para los campos generados por el runtime como $change y false caso contrario.

Quiero saber el por qué está sucediendo?

Su proyecto ya está construido en Android Studio antes de 2.0, por lo que no está preparado para usar la ejecución instantánea introducida en Android Studio 2.0

Necesito arreglar esto correctamente

Puede resolver el problema con: Ejecutar> Limpiar y volver a ejecutar, fuente: https://developer.android.com/studio/run/index.html#rerun

o por:

  1. Desactivar ejecución instantánea: Archivo> Configuración> Construir, Ejecución, Implementación> Ejecutar instantáneamente y desmarque Habilitar ejecución instantánea
  2. Ejecutar el proyecto
  3. Habilitar ejecución instantánea: Archivo> Configuración> Crear, ejecución, implementación> Ejecutar instantáneamente y active Habilitar ejecución instantánea
  • Android / Java: ¿Llamar a un método usando reflexión?
  • Field.getGenericType () devuelve la instancia de java.lang.Class en lugar de Type
  • ¿Es posible cargar dinámicamente una biblioteca en tiempo de ejecución desde una aplicación de Android?
  • Cargador de clases personalizado para android?
  • ¿Se considera reflexión y en qué grado?
  • Cómo moverse repetición similar-variable en declaraciones if
  • Anotación personalizada de Java y carga dinámica
  • Detectar videollamada entrante en android
  • Reflexión Java: implementa la interfaz y pasa a otra clase
  • Call class 'constructor por reflexión con Kotlin
  • Android Bluetooth no puede conectarse a dispositivos médicos con puerto fijo # - ¿utilizar reflexión de Java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.