Аннотации 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, может потребоваться специальная конфигурация проекта).