Используйте отражение, чтобы перебрать членов класса - PullRequest
3 голосов
/ 06 апреля 2009

У меня есть класс с многочисленными параметрами различных типов. Я хочу перебрать все члены типа A и запустить определенные функции (A.doSomething ())

Это даже не компилируется: преобразование из поля в XPathDataElement недопустимо

Field[] fields = this.getClass().getDeclaredFields();
  for (Field field : fields) {
     if (field. getType().getName().equals(XPathDataElement.class.getName()))
        {               
                tmp = (XPathDataElement)field; // Doesn't compile
                sb.append(field.getName() + ":"); 
                tmp.update();
        }
    }

Спасибо!

Ответы [ 4 ]

10 голосов
/ 06 апреля 2009

Трудно отлаживать ваш код, когда вы не говорите, что с ним не так.

Я вижу две вещи:

  1. Нет необходимости сравнивать строки, чтобы определить, является ли тип поля правильным классом.

    if (field.getType().equals(XPathDataElement.class))
    

    должно работать.

    Редактировать: Стив Рид указывает , что вам не обязательно, чтобы он был точно XPathDataElement; подкласс будет работать так же хорошо. Чтобы проверить, можно ли считать поле XPathDataElement, следует использовать Class.isAssignableFrom(Class).

    if (XPathDataElement.class.isAssignableFrom(field.getType()))
    

    будет кодом.

  2. Полагаю, ваш реальный вопрос в том, как получить значение поля отражательно? Если это так, то Field.get(Object) - это то, что вы хотите. Объект, который вы передаете get(), является тем, поле которого вы хотите получить; если вы работаете на this (который является сильным запахом кода), то ваш код будет

    XPathDataElement tmp = (XPathDataElement) field.get(this);
    
2 голосов
/ 06 апреля 2009

Я настоятельно рекомендую избегать отражения, если оно вам действительно не нужно.

Просто напишите код:

this.x.doSomething();
this.y.doSomething();
this.z.doSomething();

Или, если хотите:

for (A a : new A[] {
    this.x, this.y, this.z
}) {
    a.doSomething();
}
1 голос
/ 06 апреля 2009

пара указателей:

  1. Сравните классы на равенство, а не их имена.

    field.getType (). Equals (XPathDataElement.class)

  2. Или еще лучше, используйте isAssignableFrom(java.lang.Class) для обработки случая, когда класс объявляет тип возвращаемого значения как подкласс того, что вы ищете

    XPathDataElement.class.isAssignableFrom (field.getType ())

  3. Вы перебираете поля , а не метод . Ваш вопрос заставляет меня предположить, что вы хотите последнее, и если это так, используйте:

    this.getClass (). getDeclaredMethods ()

0 голосов
/ 06 апреля 2009

Вы, кажется, ничего не назначаете для obj, который вы разыгрываете для XPathDataElement в цикле.

Вы, вероятно, хотите сделать что-то вроде этого:

tmp = (XPathDataElement)field.get(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...