У меня есть класс с многочисленными параметрами различных типов. Я хочу перебрать все члены типа 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(); } }
Спасибо!
Трудно отлаживать ваш код, когда вы не говорите, что с ним не так.
Я вижу две вещи:
Нет необходимости сравнивать строки, чтобы определить, является ли тип поля правильным классом.
if (field.getType().equals(XPathDataElement.class))
должно работать.
Редактировать: Стив Рид указывает , что вам не обязательно, чтобы он был точно XPathDataElement; подкласс будет работать так же хорошо. Чтобы проверить, можно ли считать поле XPathDataElement, следует использовать Class.isAssignableFrom(Class).
XPathDataElement
Class.isAssignableFrom(Class)
if (XPathDataElement.class.isAssignableFrom(field.getType()))
будет кодом.
Полагаю, ваш реальный вопрос в том, как получить значение поля отражательно? Если это так, то Field.get(Object) - это то, что вы хотите. Объект, который вы передаете get(), является тем, поле которого вы хотите получить; если вы работаете на this (который является сильным запахом кода), то ваш код будет
Field.get(Object)
get()
this
XPathDataElement tmp = (XPathDataElement) field.get(this);
Я настоятельно рекомендую избегать отражения, если оно вам действительно не нужно.
Просто напишите код:
this.x.doSomething(); this.y.doSomething(); this.z.doSomething();
Или, если хотите:
for (A a : new A[] { this.x, this.y, this.z }) { a.doSomething(); }
пара указателей:
Сравните классы на равенство, а не их имена.
field.getType (). Equals (XPathDataElement.class)
Или еще лучше, используйте isAssignableFrom(java.lang.Class) для обработки случая, когда класс объявляет тип возвращаемого значения как подкласс того, что вы ищете
isAssignableFrom(java.lang.Class)
XPathDataElement.class.isAssignableFrom (field.getType ())
Вы перебираете поля , а не метод . Ваш вопрос заставляет меня предположить, что вы хотите последнее, и если это так, используйте:
this.getClass (). getDeclaredMethods ()
Вы, кажется, ничего не назначаете для obj, который вы разыгрываете для XPathDataElement в цикле.
obj
Вы, вероятно, хотите сделать что-то вроде этого:
tmp = (XPathDataElement)field.get(this);