Java аннотации - PullRequest
       32

Java аннотации

15 голосов
/ 10 апреля 2009

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

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

и класс

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 и получить name и значение поля и аннотации. Но у меня проблема с получением значения каждого поля, поскольку все они имеют различный тип данных .

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

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 полей? Или я должен сделать геттер и как-то вызвать его?

Ответы [ 4 ]

11 голосов
/ 10 апреля 2009

Каждый объект должен иметь определение 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
9 голосов
/ 10 апреля 2009

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

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

4 голосов
/ 10 апреля 2009

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

2 голосов
/ 10 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...