2012-06-21 41 views
1

如果我有一個在字段上使用的參數化註釋,字段引用的對象是否可以訪問註釋參數?如何訪問註釋實例中的註釋參數

@Retention(RetentionPolicy.RUNTIME) 
    @Target(ElementType.FIELD) 
    public @interface Classy { 
     Class<?> klazz(); 
    } 

用法:

class Bar{ 
    @Classy(klazz=Integer.class) 
    Foo foo; 
    ... 
} 

假設訪問:

class Foo{ 
    private Class<?> klazz = String.class; 

    private void useAnnotationParameterIfAvailable(){ 
    klazz = what goes here? 
    } 
} 

謝謝

回答

2

否 - 註解領域的一個屬性,並且對象不能循環中的字段目前引用它(爲了有效地查找字段,JVM必須維護專用的查找數據結構,並在每個字段賦值時更新它,這將非常昂貴.. 。)

當然,如果對象的類型唯一標識了該字段,則可以使用類路徑掃描來查找該類型的所有註釋字段 - 但是如果類型標識要使用的類,則將註釋放在類型會更容易:-)

+0

我明白了。聽起來很合理。否則會太容易了:)謝謝,meriton。 – kostja

0

使用以下目標費爾德方法。

java.lang.reflect.Field.getAnnotation(Class<T>) 

一個示例代碼

try { 
     Field field = this.getClass().getField("foo"); 
     Ignore annotation = field.getAnnotation(Classy.class); 

     //do what ever with annotation 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchFieldException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+0

謝謝Vijay,但我怕你誤解了需求 - 你正在描述如何從包含該字段的類訪問註釋,而不是從場實例本身訪問註解。即 - 代碼不能在'Foo'裏使用 – kostja

0

Foo.class.getAnnotation(Classy.class).klazz();

注意:可能需要在這裏和那裏進行一些操作,我沒有IDE。

更多的例子,在這裏看到:

http://tutorials.jenkov.com/java-reflection/annotations.html

這裏:

Is it possible to read the value of a annotation in java?

+0

謝謝istvan - 恐怕你的方法不能工作,因爲'Foo'類本身沒有註釋,只有另一個類中的'Foo'類型的字段。 'class.getAnnotation()'將始終返回'null'。 – kostja

+0

是的,認爲課堂本身有註釋,對不起。 –