Аннотации Java

Я создал простую аннотацию в Java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
    String columnName();
}

и class

public class Table {

    @Column(columnName = "id")
    private int colId;

    @Column(columnName = "name")
    private String colName;

    private int noAnnotationHere;

    public Table(int colId, String colName, int noAnnotationHere) {
       this.colId = colId;
       this.colName = colName;
       this.noAnnotationHere = noAnnotationHere;
    }  
}

Мне нужно выполнить итерацию по всем полям, которые аннотируются с помощью Column и получить имя и значение поля и аннотации. Но у меня проблема с получением значения каждого поля, так как все они имеют разные типы данных .

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

Table table = new Table(1, "test", 2);

for (Field field : table.getClass().getDeclaredFields()) {
    Column col;
    // check if field has annotation
    if ((col = field.getAnnotation(Column.class)) != null) {
        String log = "colname: " + col.columnName() + "\n";
        log += "field name: " + field.getName() + "\n\n";

        // here i don't know how to get value of field, since all get methods
        // are type specific

        System.out.println(log);
    }
}

Нужно ли обертывать каждое поле объекта, которое будет реализовывать метод, например getValue(), или есть ли лучший способ обойти это? В основном все, что мне нужно, это строковое представление каждого поля, которое аннотируется.

edit: yep field.get(table) работает, но только для полей public, есть ли способ сделать это даже для полей private? Или мне нужно сделать getter и каким-то образом вызвать его?

Ответы

Ответ 1

Каждый объект должен иметь toString(). (И вы можете переопределить это для каждого класса, чтобы получить более значимое представление).

Итак, вы, где ваш комментарий "//здесь я не знаю", вы могли бы:

Object value = field.get(table);
// gets the value of this field for the instance 'table'

log += "value: " + value + "\n";
// implicitly uses toString for you
// or will put 'null' if the object is null

Ответ 2

Отражение - это именно то, как его решить. Обнаружение вещей о типах и их членах во время выполнения - это в значительной степени определение рефлексии! То, как вы это сделали, выглядит хорошо для меня.

Чтобы найти значение поля, используйте field.get(table)

Ответ 3

Отражение - это именно то, как смотреть аннотации. Они представляют собой форму "метаданных", прикрепленных к классу или методу, и аннотации Java были спроектированы таким образом, чтобы их рассматривали.

Ответ 4

Отражение - это один из способов обработки объекта (возможно, единственный способ, если поля являются частными и не имеют какого-либо метода доступа). Вам нужно посмотреть Field.setAccessible и, возможно, Поле. GetType.

Другим подходом является создание другого класса для перечисления аннотированных полей с использованием компиляционного компилятора времени. Для этого требуется API com.sun в Java 5, но поддержка лучше в Java 6 JDK (для таких IDE, как Eclipse, может потребоваться специальная конфигурация проекта).