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 ).
- Protección contra la reflexión - android
- ¿Cómo utilizar la reflexión para cambiar el servicio de copia de seguridad?
- Cómo comprobar qué sim se establece como predeterminado en android programatically
- UnsuppotedOperationException.getCause se devuelve
- Java Reflection - Obtener todos los nombres de variables de instancia de una clase
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.
- Cargador de clases personalizado para android?
- Error de método de reflexión de Android
- Confirmación de mi comprensión del principio de Android Concept (uso de múltiples actividades)
- Cómo acceder a setPreferredNetworkType en la fuente de Android
- Clase personalizada que carga / reemplaza las clases nativas de Android
- BackupAgent compatible con versiones anteriores
- ¿Debo dejar el hack de reflexión bluetooth en código de producción?
- Android / Java: ¿Llamar a un método usando reflexión?
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.
- AdvertisingIdClient # getAdvertisingIdInfo a veces devuelve null desde v9.8.0
- Cómo implementar efectos de distorsión de imagen en Android