2014-09-25 9 views
0

Учитывая, например, класс, как это:Получить экземпляр поля от абстрактного класса

public abstract class AbstractSomething { 

    public static volatile SingularAttribute<Somefield, AnotherField> myAttribute; 
} 

, как я могу получить экземпляр myAttribute с помощью отражения. Нет классов реализации для AbstractSomething.


EDIT

Нет, нам нужен экземпляр SingularAttribute<T, S>. И причина, по которой мы должны использовать отражение, состоит в том, что эти классы генерируются и передаются в наш метод как объект Class. Мы никоим образом не знаем, какой AbstractSomething мы получаем. Их немало.


EDIT 2

Найдено, что этот вопрос. Когда в приложении присутствует контекст Hibernate, интерфейсы в абстрактном классе заменяются их экземплярами реализации при обращении к ним.

+0

Я не понимаю. Вам нужен экземпляр 'Field' для поля' myAttribute' из класса 'AbstractSomething'? –

+0

Зачем вам нужно получить это через отражение? Какая у вас информация? Что вы пробовали, и что случилось? Нам нужна дополнительная информация. –

+0

Это поле 'static', там не много' myAttribute', только одно. –

ответ

1

Ничего особенного на самом деле, вы можете сделать что-то вроде этого:

Field field = AbstractSomething.class.getField("myAttribute") 

И тогда вы можете получить доступ к нему, вызывая field.get(null) и field.set(null, value)

Реальный вопрос почему вы хотите использовать отражение, но я думаю, у вас есть свои причины.

EDIT:

Если у вас есть экземпляр класса в перед рукой (назовет его classInstance), то вы можете сделать

Field field = classInstance.getField("myAttribute") 

, чтобы получить поле, reificates поля, которое вы ищете ... и если вы хотите, чтобы все поля просто вызывали метод getFields.

Вам действительно не нужна конкретная реализация или экземпляр рассматриваемого класса, для доступа к статическим полям.

+0

Пожалуйста, см. мое редактирование. –

+0

Значит, вы не знаете «AbstractSomething», но у вас есть экземпляр класса ... не можете ли вы просто сделать classInstance.getField («myAttribute»)? – Claudio

0

Не нужно отражать. Поле принадлежит к классу , и независимо от того, сколько подклассов есть, есть только один экземпляр AbstractSomething класса, так просто:

SingularAttribute<Somefield, AnotherField> attr = AbstractSomething.myAttribute; 
+0

Они не Кажется, что во время компиляции не было доступа к типам AbstractSomething. –

+0

@SotiriosDelimanolis - Действительно :( –

+0

Итак, что вы знаете? Имя поля? Тип? Модификаторы (статические, защищенные и т. Д.)? Что-то другое? – Bohemian

Смежные вопросы