Acceso a campos desde un objeto proxy

Me he encontrado con un problema interesante al desarrollar un framework ORM para Android. Estoy usando una biblioteca llamada dexmaker para la manipulación de bytecode, que me permite crear proxies para objetos persistentes con el fin de implementar la carga perezosa.

La instancia proxied tiene un InvocationHandler asociado de tal manera que cuando un método es llamado en el proxy, el método invoke es llamado en el InvocationHandler , que entonces llama al método del objeto proxied respectivo asumiendo que ha sido perezosamente cargado. Nada demasiado sorprendente – es como la clase Proxy de Java, pero me permite dar un proxy a las clases reales en lugar de interfaces (vea ProxyBuilder de dexmaker ).

La parte que se ha vuelto problemática es que también uso la reflexión para recuperar valores de campo de objetos persistentes y – ahora que he introducido carga perezosa – proxies. Esto es lo que estoy haciendo actualmente:

 for (Field f : getPersistentFields(model.getClass()) { ... Object val = f.get(model); // model is either a persistent object or a proxy for one mapField(f, val, map); } 

Esto por supuesto funciona para instancias de modelo regulares, pero para instancias proxy, f.get(model) no está recuperando el valor de campo del objeto f.get(model) . En su lugar, está devolviendo el valor predeterminado asignado en el constructor de la clase. El acceso en el campo del proxy no está siendo interceptado obviamente.

Mi pregunta es la siguiente: ¿hay alguna manera de interceptar un acceso en la variable miembro de un proxy que se hace a través de la reflexión? Si no es así, ¿cómo puedo recuperar el valor del campo de un proxy de una manera "reflexiva"?

Una posible solución en la que estoy pensando sería recuperar y luego invocar el método getter del campo usando la reflexión, pero me pregunto si hay una solución más directa. Esta solución, si realmente funciona , requeriría que el objeto tuviera un método getter para todos los campos persistentes, un requisito que normalmente debería seguirse desde un punto de vista de diseño OO, pero también fuerza más trabajo al usuario del marco.

Estoy abierto a cualquier idea.

Una buena solución es acceder a los campos utilizando setter / getters en lugar de usar la clase Field. (Creo que esto es más que una solución)

Por otro lado, si usted quiere ir con el enfoque de acceso directo al campo. Por lo que veo no hay una manera fácil de interceptar los accesos de campo. Por favor, compruebe las respuestas a esta pregunta . A pesar de que la pregunta está relacionada con interceptar la modificación de campo en lugar de leer el campo, puede proporcionar algunas ideas y dirección.

  • ¿Es posible cargar dinámicamente una biblioteca en tiempo de ejecución desde una aplicación de Android?
  • Reflexión para un campo que va mal
  • Modo de avión en Jelly Bean
  • ¿Cómo obtengo el nombre del método dentro de ese método?
  • Detectar videollamada entrante en android
  • Java / Android Método de llamada desde cadena WITH Value
  • Métodos de reflexión no funcionan cuando se utiliza proguard para la aplicación de Android
  • Obtener "java.lang.reflect.InvocationTargetException" al intentar registrar receptor de difusión de apk incrustado
  • Field.getGenericType () devuelve la instancia de java.lang.Class en lugar de Type
  • Uso de jarras que utilizan clases java.beans (Introspector, BeanInfo o PropertyDescriptor)
  • Compruebe si el objeto tiene un método en Java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.