2011-02-08 14 views
8

Ho la struttura e le classi seguenti.Accesso Java alla proprietà privata tramite Reflection

Ho l'oggetto ClassC e sto cercando di ottenere fieldX tramite reflection.

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

Ma sto ricevendo eccezione NoSuchMethod.

Ho provato anche a raggiungere direttamente il campoX. Ma questa volta ricevo l'eccezione NoSuchField.

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

Qual è la cosa che sto facendo male? C'è un modo per ottenere questo campoX dall'oggetto ClassC?

Soluzione: (grazie mille vz0 per la soluzione);

l'accesso diretto al campo privato:

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

metodo di chiamata;

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)); 

risposta

12

Il Class.getMethod chiamata è solo per i metodi pubblici. È necessario utilizzare la chiamata Class.getDeclaredMethod e quindi impostando la proprietà 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: Poiché il metodo getFieldX viene dichiarato il ClassA, è necessario recuperare il metodo da ClassA e non ClassC. Al contrario della chiamata getMethod, chiamare getDeclaredMethodignores superclasses.

+0

Ciò non funzionerà poiché il metodo non è dichiarato in 'ClassC'. – BalusC

+0

Typo modificato, thx. – vz0

+0

Chiarimento aggiunto. – vz0

Problemi correlati