Отражение Java: Найдите поля подкласса

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

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

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

C => B => A

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

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

5
задан roufamatic 31 January 2010 в 15:46
поделиться

3 ответа

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

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

13
ответ дан 18 December 2019 в 11:56
поделиться
Field[] fields = getClass().getSuperclass().getDeclaredFields();

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

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

1
ответ дан 18 December 2019 в 11:56
поделиться

Существует атрибут uri, который не имеет документов , но его можно увидеть в источнике :

<a href="${createLink(uri:'/path/page.gsp')}">link</a>

HTH

-121--1885321-

Для каждого класса в иерархии наследования класса объекта (через getSuperclass () ) необходимо многократно использовать getTaxingFields () .

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

-121--4648432-

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

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

Изменить: Если я неправильно понял ваш вопрос, и вы на самом деле хотите знать о родительских классах, то да: getSharingFields () является правильным отражающим методом для использования, как упомянуто в других плакатах.

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

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

getClass().getParentClass().getDeclaredFields()

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

1
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: