2012-03-14 15 views
9

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.

+0

¿Los campos todavía se están modificando? ¿Cómo? –

+0

Los campos proxy no se modifican. –

+0

¿Puede por favor elaborar algo sobre su diseño? ¿Las clases proxy representan el modelo o tienen una conexión con el objeto modelo? –

Respuesta

1

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

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

+0

Gracias, visir. Seguí adelante e implementé el primer enfoque, usando los métodos getter para acceder a los campos. Parecía el enfoque más directo y funciona bastante bien. –

Cuestiones relacionadas