9 votes

Java : accès à une propriété privée via Reflection

J'ai la structure de paquetage et les classes suivantes.

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

package Y
    Class B extends A
    Class C extends B

J'ai l'objet ClassC et j'essaie d'obtenir fieldX par réflexion.

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

Mais je reçois l'exception NoSuchMethod.

J'ai également essayé de joindre directement le fieldX. Mais cette fois, j'obtiens l'exception NoSuchField.

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

Quelle est la chose que je fais mal ? Existe-t-il un moyen d'obtenir ce champX à partir de l'objet ClassC ?

Solution : (merci beaucoup vz0 pour la solution) ;

Accès direct à un terrain privé :

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

Appel à la méthode ;

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

13voto

vz0 Points 11605

En Class.getMethod ne concerne que les méthodes publiques. Vous devez utiliser la méthode Class.getDeclaredMethod puis en réglant le 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);

EDITAR: Depuis l'entrée en vigueur de la getFieldX est déclarée sur ClassA Vous devez récupérer la méthode dans la classe A et non dans la classe C. Contrairement à getMethod l'appel, le getDeclaredMethod appel ignore les superclasses .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X