Как я могу получить поле Array класса с отражением? - PullRequest
1 голос
/ 30 августа 2011

Мой класс A имеет

   AClaz[] rofl;

В документации для getDeclaredFields говорится "Этот метод возвращает массив длины 0, если класс или интерфейс не объявляет полей или если этот объект Class представляет примитивный тип, класс массива, или void. "

Я хочу получить доступ к массиву rofl типа AClaz с помощью отражения.Даже если AClaz является внутренним классом класса A.

Итак, я бы сделал getDeclaredClass?

Ответы [ 3 ]

5 голосов
/ 30 августа 2011

Вы неправильно читаете документацию - речь идет о вызове getDeclaredFields для класса массива, например:

Class<?> arrayClass = String[].getClass();
Field[] fields = arrayClass.getDeclaredFields();

Вы можете без проблем получить поле от A, используя

Field[] fields = A.class.getDeclaredFields();

и затем выполнить итерацию по массиву, или

Field roflField = A.class.getDeclaredField("rofl");

Тот факт, что тип поля является массивом, вовсе не является проблемой.

1 голос
/ 30 августа 2011

getDeclaredFields() возвращает все поля, т.е. экземпляры класса Field. Вы хотите получить доступ к одному из полей с именем rofl, поэтому вы можете либо перебирать массив, возвращаемый getDeclaredFields(), либо использовать getDeclaredField("rofl"). Затем, получив экземпляр Field, вы можете получить доступ к самому значению поля, используя set() и get(). Если вы хотите установить значение, вы должны предоставить значение правильного типа, то есть массив AClaz.

Если вы хотите изменить один элемент существующего массива, хранящегося в поле rofl в вашем классе, вы должны сказать что-то вроде этого: Array.set(field.get(instance), index, element)

0 голосов
/ 04 января 2012

вы можете получить такие поля как ...

Class<?> arrayClass = String[].getClass();
Field[] fields =  arrayClass.getDeclaredFields();
for(int i =0; i<fields.length; i++){

  if(fields[i].isArray()){
//array type fields can be checked like this
    fields[i] is array
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...