122

これは私のコードです:

@Column(columnName="firstname")


private String firstName;

 @Column(columnName="lastname")
 private String lastName;

 public String getFirstName() {
  return firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

別のクラスで注釈 @Column( columnName ="xyz123") の値を読み取ることは可能ですか?

4

9 に答える 9

140

はい、列アノテーションに実行時保持がある場合

@Retention(RetentionPolicy.RUNTIME)
@interface Column {
    ....
}

あなたはこのようなことをすることができます

for (Field f: MyClass.class.getFields()) {
   Column column = f.getAnnotation(Column.class);
   if (column != null)
       System.out.println(column.columnName());
}

更新:プライベートフィールドを取得するには、

Myclass.class.getDeclaredFields()
于 2010-11-28T13:27:50.080 に答える
92

もちろん。注釈の例を次に示します。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {

    String testText();
}

そして、サンプルの注釈付きメソッド:

class TestClass {

    @TestAnnotation(testText="zyx")
    public void doSomething() {}
}

そして、testText の値を出力する別のクラスのサンプル メソッド:

Method[] methods = TestClass.class.getMethods();
for (Method m : methods) {
    if (m.isAnnotationPresent(TestAnnotation.class)) {
        TestAnnotation ta = m.getAnnotation(TestAnnotation.class);
        System.out.println(ta.testText());
    }
}

あなたのようなフィールド注釈と大差ありません。

乾杯!

于 2010-11-28T13:30:05.460 に答える
22

私はそれをしたことがありませんが、Reflectionがこれを提供しているようです。FieldであるAnnotatedElementため、ありますgetAnnotationこのページには例があります(以下にコピー)。アノテーションのクラスがわかっていて、アノテーションポリシーが実行時にアノテーションを保持している場合は、非常に簡単です。当然、保持ポリシーが実行時にアノテーションを保持しない場合、実行時にアノテーションを照会することはできません。

その後削除された回答(?)は、役立つ注釈チュートリアルへの便利なリンクを提供しました。人々がそれを使用できるように、私はここにリンクをコピーしました。

このページの例:

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno {
  String str();

  int val();
}

class Meta {
  @MyAnno(str = "Two Parameters", val = 19)
  public static void myMeth(String str, int i) {
    Meta ob = new Meta();

    try {
      Class c = ob.getClass();

      Method m = c.getMethod("myMeth", String.class, int.class);

      MyAnno anno = m.getAnnotation(MyAnno.class);

      System.out.println(anno.str() + " " + anno.val());
    } catch (NoSuchMethodException exc) {
      System.out.println("Method Not Found.");
    }
  }

  public static void main(String args[]) {
    myMeth("test", 10);
  }
}
于 2010-11-28T13:23:40.087 に答える
6

これまでに与えられたすべての回答は完全に有効ですが、注釈スキャンへのより一般的で簡単なアプローチのために、 Google Reflects ライブラリにも留意する必要があります。

 Reflections reflections = new Reflections("my.project.prefix");

 Set<Field> ids = reflections.getFieldsAnnotatedWith(javax.persistence.Id.class);
于 2015-02-05T08:34:06.577 に答える