15

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ますか? それとも、ゲッターを作成して何らかの方法で呼び出す必要がありますか?

4

4 に答える 4

11

すべてのオブジェクトで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
于 2009-04-10T15:58:52.683 に答える
9

リフレクションはまさにそれを解決する方法です。実行時に型とそのメンバーに関することを見つけることは、ほとんどリフレクションの定義です!あなたがそれをした方法は私にはうまく見えます。

フィールドの値を見つけるには、次を使用しますfield.get(table)

于 2009-04-10T15:59:05.677 に答える
4

リフレクションは、まさに注釈を見る方法です。これらはクラスまたはメソッドに付加された「メタデータ」の形式であり、Javaアノテーションはそのように検査されるように設計されています。

于 2009-04-10T16:00:39.603 に答える
2

リフレクションは、オブジェクトを処理する 1 つの方法です (おそらく、フィールドがプライベートであり、アクセサー メソッドがない場合は唯一の方法です)。Field.setAccessibleとおそらくField.getTypeを確認する必要があります。

もう 1 つの方法は、コンパイル時の注釈プロセッサを使用して、注釈付きフィールドを列挙するための別のクラスを生成することです。これには Java 5 のcom.sun API が必要ですが、サポートは Java 6 JDK の方が優れています (Eclipse のような IDE では特別なプロジェクト構成が必要になる場合があります)。

于 2009-04-10T16:19:55.753 に答える