Доступ Java к частной собственности через Reflection - PullRequest
8 голосов
/ 08 февраля 2011

У меня есть следующая структура пакета и классы.

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

package Y
    Class B extends A
    Class C extends B

У меня есть объект ClassC и я пытаюсь получить fieldX через отражение.

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

Но я получаю исключение NoSuchMethod.

Я также пытался связаться с fieldX напрямую.Но в этот раз я получаю NoSuchField Exception.

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

Что я делаю неправильно?Есть ли способ получить это поле X из объекта ClassC?

Решение: (большое спасибо vz0 за решение);

Прямой доступ к приватному полю:

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

Вызов метода;

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

1 Ответ

12 голосов
/ 08 февраля 2011

Вызов Class.getMethod предназначен только для открытых методов. Вам нужно использовать вызов Class.getDeclaredMethod, а затем установить для свойства 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);

РЕДАКТИРОВАТЬ: Поскольку метод getFieldX объявлен на ClassA, вам нужно получить метод из ClassA, а не ClassC. В отличие от вызова getMethod, вызов getDeclaredMethod игнорирует суперклассы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...