Отражение Java: Найти поля подкласса - PullRequest
4 голосов
/ 31 января 2010

У меня есть иерархия классов, например: (=> означает "является подклассом")

anonymous instance class => abstract class => generic abstract class

или более кратко:

C => B => A

При выполнении «C» вызывает один из методов «A». В этом методе в «A» я хочу использовать отражение, чтобы найти защищенные поля объекта, которые определены в классе «B». (Таким образом, это поля, которые могут видеть «C» и «B», но не «A».)

Как бы я сделал это с помощью отражения Java? И как я могу рассчитывать на будущее, если я добавлю что-то между A & B или B & C?

Ответы [ 3 ]

12 голосов
/ 31 января 2010

Вы должны повторно использовать getDeclaredFields() для каждого класса в иерархии наследования класса вашего объекта (через getSuperclass()).

Однако то, что вы планируете, звучит как грубое нарушение концепции наследования. Лучший способ заглянуть в будущее - полностью избежать такого рода вещей. Что вы пытаетесь сделать, что, по вашему мнению, требует такого отражения махинаций?

1 голос
/ 31 января 2010

Насколько я знаю, нет никакого способа узнать о ваших "дочерних классах" в Java. Не лучше ли было бы создать абстрактный метод для A, который B должен был бы реализовать, и вместо этого вызвать его?

public class A {
   //other stuff here
   protected void abstract mySubMethod();
   //other stuff here
}

Edit: Если я неправильно понял ваш вопрос, и вы действительно хотите знать о родительских классах, тогда да: getDeclaredFields () - это правильный рефлексивный метод для использования, как упоминалось другими авторами.

Дополнительные правки: Я не хочу продолжать изменять этот ответ, но ... В общем, если вы пытаетесь предоставить доступ к родительскому классу, «правильный» и «перспективный» способ сделать это - создать абстрактные методы, которые являются геттерами или сеттерами (или даже более сложными, если необходимо), а затем имеют дети уважают их или нет и отвечают соответствующим образом.

Как говорится, вы можете сделать что-то, как говорили другие:

getClass().getParentClass().getDeclaredFields()

Однако это сработало бы, только если C всегда напрямую наследуется от B. Отражения по своей природе хитры и специфичны. Я должен сделать МНОГО этого в проекте, над которым я работаю (не спрашивайте, поверьте мне, вы не хотите знать), и я избегаю этого всякий раз, когда это возможно. Если у А нет веских причин для того, чтобы требовать защищенные поля и он обнаруживает информацию о них, то вы, вероятно, захотите использовать абстрактный метод. Я бы также сказал, что вы можете решить другую проблему с помощью абстрактного метода, однако это может быть немного сложнее.

1 голос
/ 31 января 2010
Field[] fields = getClass().getSuperclass().getDeclaredFields();

А затем итерируйте эти поля и получите те, которые вы хотите.

В случае, если ваша иерархия растет, вы можете преобразовать вышеприведенное в рекурсивные вызовы в getSuperclass() (пока getSuperclass() != Object.class), собирая все поля всех суперклассов.

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