Me he encontrado con un problema interesante al desarrollar un marco ORM para Android. Estoy usando una biblioteca llamada dexmaker para la manipulación de código byte, que me permite crear proxies para objetos persistentes con el fin de implementar la carga diferida.Accediendo a los campos de un objeto proxy
La instancia de proxy tiene un asociado InvocationHandler
tal que cuando un método se llama en el proxy, el método invoke
se llama en la InvocationHandler
, que a continuación llama al método respectivo de los objetos proxy suponiendo que ha sido cargado con pereza. Nada demasiado sorprendente: es como la clase Proxy de Java, pero me permite hacer un proxy de clases reales en lugar de interfaces (ver dexmaker's ProxyBuilder).
La parte que se ha vuelto problemático es que yo también uso reflexión para recuperar los valores de campo de los objetos persistentes y - ahora que he introducido la carga diferida - proxies. Aquí 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);
}
Por supuesto, esto funciona para instancias de modelo regulares, pero para casos pasan por el proxy, f.get(model)
no recupera el valor del campo de los objetos proxy. En cambio, devuelve el valor predeterminado asignado en el constructor de la clase. El acceso en el campo del proxy no se intercepta, obviamente.
Mi pregunta es esta: ¿hay alguna manera de interceptar un acceso en la variable de miembro de un proxy hecha a través de la reflexión? Si no es así, ¿cómo puedo recuperar el valor del campo de un proxy de forma "reflexiva"?
Una posible solución Estoy pensando en recuperar e invocar el método getter del campo utilizando la reflexión, pero me pregunto si hay una solución más directa. Esta solución, si realmente funciona , requeriría el objeto de tener un método de obtención de todos los campos persistentes - un requisito que por lo general se deben seguir desde un punto de vista OO-diseño, sino también fuerza más trabajo en el usuario de la marco de referencia.
Estoy abierto a cualquier idea.
¿Los campos todavía se están modificando? ¿Cómo? –
Los campos proxy no se modifican. –
¿Puede por favor elaborar algo sobre su diseño? ¿Las clases proxy representan el modelo o tienen una conexión con el objeto modelo? –