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
を取得する必要があります。しかし、それらはすべて異なるデータ型であるため、各フィールドの値を取得するのに問題があります。
特定の注釈を持つフィールドのコレクションを返すものはありますか? このコードでなんとかできましたが、リフレクションはそれを解決する良い方法だとは思いません。
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()
必要がありますか、またはこれを回避するより良い方法がありますか? 基本的に必要なのは、注釈が付けられた各フィールドの文字列表現だけです。
編集:はいfield.get(table)
、機能しますが、フィールドに対してのみ、public
フィールドに対してもこれを行う方法はありprivate
ますか? それとも、ゲッターを作成して何らかの方法で呼び出す必要がありますか?