Classインスタンスは、少なくともgetAnnotation
メソッドに関しては、Classオブジェクトとオブジェクトを比較して異なるシグネチャを持っていることがわかり<some-object>.getClass()
ます。
次のコードは、ケースの例を示しています。
@Bar("hello")
public class Foo {
public static void main(String[] args) {
Foo foo=new Foo();
Bar bar1,bar2,bar3;
Class clazz=foo.getClass();
//This compiles and work (as expected)
bar1=foo.getClass().getAnnotation(Bar.class);
//This does not compile!
bar2=clazz.getAnnotation(Bar.class);
//This one copiles and work!
bar3=(Bar) clazz.getAnnotation(Bar.class);
}
}
@Retention(RetentionPolicy.RUNTIME)
@interface Bar {
String value();
}
注:この例全体は、エディターからのコピー&ペーストです。
--------より良いシナリオを表示するための変更
外部ライブラリのように、「コード」がFooの存在を認識していないことを例で示すのを忘れました。
class SomeExternalLibrary{
public static void someMethod(Class clazz){
Bar bar2,bar3;
bar2=clazz.getAnnotation(Bar.class);
//This one copiles and work!
bar3=(Bar) clazz.getAnnotation(Bar.class);
}
}
この外部ライブラリを使用するコードは次のようになります。
SomeExternalLibrary.someMethod(Foo.class);
私のシナリオの現実にあまり気づいていないことをお詫びします:-)