У меня есть иерархия классов как так: (=> означает, "подкласс"),
anonymous instance class => abstract class => generic abstract class
или более кратко:
C => B => A
При выполнении "C" называет один из "A" методов. В рамках того метода в "A" я хочу использовать отражение для нахождения защищенных полей объекта, которые определяются в классе "B". (Таким образом, это поля, которые "C" и "B" видят, но не "A".)
Как я сделал бы это с отражением Java? И как я могу соответствовать требованиям завтрашнего дня он в случае, если я добавляю что-то между A & B или B & C?
Вы должны многократно использовать getDeclaredFields ()
для каждого класса в иерархии наследования класса вашего объекта (через getSuperclass ()
).
Однако то, что вы планируете, звучит как вопиющее нарушение концепции наследования. Наилучший способ подготовиться к будущему - полностью избегать подобных вещей. Что вы пытаетесь сделать, что, по вашему мнению, требует таких махинаций с отражением?
Field[] fields = getClass().getSuperclass().getDeclaredFields();
, а затем повторяют эти поля и получают те, которые вы хотите.
Если ваша иерархия растет, вы можете преобразовать вышесказанное на рекурсивные звонки на getsuplass ()
(в то время как getsuplass ()! = Object.Class
), что собирает все поля всех суперкласс.
Существует атрибут 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. Размышления является, по самой природе, хитрым и специфическим. Я должен сделать МНОГО этого на проекте, на котором я нахожусь (не спрашивайте, поверьте мне, вы НЕ хотите знать), и я избегаю его, когда это возможно. Если нет веской причины для того, чтобы А нуждался в защищенных полях и он обнаруживает информацию о них, то, скорее всего, вы захотите использовать абстрактный метод. Я также считаю, что вполне вероятно, что вы можете решить другую проблему абстрактным методом, однако это может быть немного сложнее.