2011-02-08 14 views
8

Tengo las siguientes estructuras y clases de paquetes.Java accediendo a propiedad privada a través de Reflection

package X 
    Class A 
     private string fieldX; 
     protected string getFieldX(){ return fieldX}; 

package Y 
    Class B extends A 
    Class C extends B 

Tengo el objeto ClassC y trato de obtener fieldX a través de la reflexión.

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassC.class.getMethod("getFieldX",partypes); 
String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

Pero obtengo la excepción NoSuchMethod.

Intenté también llegar directamente al campoX. Pero esta vez recibo la excepción NoSuchField.

Field reqField = ClassC.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
Object value = reqField.get(classCInstance); 
String retValue = (string) value; 

¿Qué es lo que estoy haciendo mal? ¿Hay alguna manera de obtener este campoX del objeto ClassC?

Solución: (muchas gracias vz0 por la solución);

acceso directo al ámbito privado:

Field reqField = ClassA.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
String value = (String)reqField.get(clazzc); 

método de llamada;

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 
getContextMethod.setAccessible(true); 
System.out.println((String)getContextMethod.invoke(clazzc, arglist)); 

Respuesta

12

La llamada Class.getMethod es sólo para los métodos públicos. Es necesario utilizar la llamada Class.getDeclaredMethod y después de establecer la propiedad Method.setAccessible true:

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 

getContextMethod.setAccessible(true); 

String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

EDIT:getFieldX Dado que el método se declara en ClassA, es necesario buscar el Método de Clase A ni no ClassC. Como opuesto a la llamada getMethod, la llamada getDeclaredMethodignores superclasses.

+0

Esto no funcionará ya que el método no está declarado en 'ClassC'. – BalusC

+0

Typo editado, thx. – vz0

+0

Aclaración añadida. – vz0

Cuestiones relacionadas