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