Как получить значение аннотированного поля.

 
 
 
Сообщения:806
Здравствуйте!

Как узнать значение поля, аннотированного @Id?

Спасибо.
 
 
Сообщения:6978
Что значит "узнать"? Вопрос как-то абсурдно поставлен. А как узнать значение поля, НЕ аннотированного @Id? Проблема-то в чем?

С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
 
 
Сообщения:690
В двух словах:
Field[] sourceFields = sourceClass.getDeclaredFields();
for(Field f : sourceFields){
   if (f.isAnnotationPresent(Здесь класс, который extends Annotation, по сути ваш @Id)){
      //ваш код
   }
}
 
 
Сообщения:6978
А Вы в Java API для java.lang.reflect.Field вообще заглядывали?

http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#get(java.lang.Object)

С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
 
 
Сообщения:690
Женя, вы меня спрашиваете? Безусловно :)
 
 
Сообщения:6978
Тогда Ваш вопрос о том, как, имея Field и экземпляр класса, получить значение этого поля, - он как минимум странен. Если Вы действительно читали API, то метод get(Object) пропустить достаточно сложно.

С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
 
 
Сообщения:690
Сорри, но я в этом топике вопросов не задавал :wink:
 
 
Сообщения:6978
Упс... СОРРИ!!! Просмотрел! Простите великодушно!

С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
 
 
Сообщения:1
Тут спрашивали как получить значение поля,
а вы привели код как получить поле (Field f)

Object valueOfyourField = f.get(obj);
где obj - объект класса в котором грабаешь филды
 
 
Сообщения:175
Давайте я оживлю тему, потому что столкнулся с кажется похожей проблемой.

У меня есть класс
Внутри которого есть описанные интерфейсы аннотаций:

public class myclass{
 public @interface id{
     public string key();
  }
}


Есть сам класс где описано поле с этой аннотацией

public class myclass2 extends myclass{
   @id(key="car")
    int mKey;
}


Теперь начинается магия с отражением

Я вызываю функцию куда передаю собственно сам класс
myfunc(myclass2.class);


В самой функции такой код:
public void myfunc(Class nameClass){
  Fields[] fields = nameClass.getDeclaredFields();
  Object obj = null;
  
    // я набираю код на планшете и поэтому для упрощения убрал обработку исключений
   obj = nameClass.newInstance();
   String value;
   for (Field field: fields){
       field.setAccessible(true);
       if ("int".equals(field.getType().toString()){
           value = "" + field.getInt(obj);
           System.out.println(value);
       }
      // а вот дальше какие то грабли у меня
      if (field.isAnnotationPresent(вот тут какой класс?),{

      }
      // вот тут я пытался еще так пойти
      Annotation[] ann = field.getAnnotations();
      // но размер массива всегда равен нулю

    }
   
}


Если где допустил ошибки в коде прошу прощения, код набирал на планшете

//wbr
Изменен:29 фев 2016 09:54
 
 
Сообщения:806
Добрый день! Переписал Ваш код в рабочий вид, как понял идею. Выполняется и выводит значение аннотированоого @Id поля.


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Field;

public class Annotations {

    public static void main(String[] args) throws IllegalAccessException {
        Car car = new Car(1234, "Желтый");
        System.out.println("id = " + getId(car));
    }

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Id {
        String key();
    }

    public static class Car {

        @Id(key = "vin")
        private int vin;

        private String color;

        public Car(int vin, String color) {
            this.vin = vin;
            this.color = color;
        }
    }

    public static Object getId(Object o) throws IllegalAccessException {
        Field[] fields = o.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);

            if (field.isAnnotationPresent(Id.class)) {
                return field.getAnnotation(Id.class).key() + " " + field.get(o);
            }

        }
        return null;
    }

}

Изменен:29 фев 2016 10:12
 
 
Сообщения:175
pjotar:
Добрый день! Переписал Ваш код в рабочий вид, как понял идею. Выполняется и выводит значение аннотированоого @Id поля.
[/code]


Большое спасибо, по крайне мере я понял что передавать в isAnnotationPresent(Id.class)
А как получить вот это значение
 @Id(key = "vin")
  private int vin;

то бишь значение key

Еще раз спасибо

//wbr
Изменен:29 фев 2016 10:09
 
 
Сообщения:806
Обновил предыдующий ответ
 
 
Сообщения:175
pjotar:
Обновил предыдующий ответ


Спасибо!

//wbr
 
 
Сообщения:175
А еще один вопрос, вот есть такая аннотация

@Retention(RetentionPolicy.RUNTIME)
    public @interface Id {
        String key();
        String name();

    }


как можно (и можно ли) сделать что бы работала такая конструкция

  
@Id(key = "vin")
private int vin;


то есть без определение значения name.

или только так возможно
@Retention(RetentionPolicy.RUNTIME)
    public @interface Id {
        String key();
}

@Retention(RetentionPolicy.RUNTIME)
    public @interface name {
        String name();
}


	@id(key = "vin")
	@field(name = "oleg")
private int vin;
    

//wbr
Изменен:01 мар 2016 10:31
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет