2009-09-01 13 views
15

私は多少Javaに慣れていないので、おそらく私はJavaのアノテーションのユースケースを誤解しています。私の問題は以下の通りです:Javaアノテーションは暗黙のクラス名を返します

メソッドに注釈を付けた後、メソッドの注釈を検査するときに、$ Proxy31などのクラス名を受け取ります。なぜ私はこれに似たアノテーションのクラス名を受け取っているのか、この問題を解決するために何ができるのか不思議です。

Method m = this.remoteServiceClass.getMethod(rpcRequest.getMethod().getName()); 
RequiredPermission a = m.getAnnotation(RequiredPermission.class); 

これは私がそれを見上げているメソッドが実装RequiredPermission注釈を持っていることを知っているにもかかわらず、ヌル注釈を返します。

for(Annotation a : m.getAnnotations()) 
{ 
    System.out.println(a.getClass().getName()); 
} 

これは、$ Proxy31クラス名を表示します。

+0

問題を示すために、短くて完全なプログラムを提供してください。コードなしでは、何が起こっているのかを知ることは難しい/不可能です。 –

+0

リモートクラスにメソッドがあるか、rpcRequestクラスに注釈が実装されていますか?アノテーションは実行時の保持を持ち、メソッド型に適用されますか? (アノテーションが正しくアノテートされていない場合は、エラーは発生しません。注釈が欠落するだけです)。 – Yishai

+0

remoteServiceClassにはメソッドがあり、注釈には実行時の保持とメソッドのターゲット要素タイプがあります。私はクラスから実際のメソッドを取得するためにrpcRequestから名前を使用しています。 – bdorry

答えて

21

注釈aを指定すると、注釈のタイプを判別するためにgetClass()ではなくannotationType()を呼び出す必要があります。 Annotationオブジェクトは、そのクラスの注釈のインスタンスを表すプロキシです。

Object o = ...; 
Class c = o.getClass(); 
Annotation[] as = c.getAnnotations(); 
for (Annotation a : as) { 
    // prints out the proxy class name 
    System.out.println(a.getClass().getName()); 
    // prints out the name of the actual annotation 
    System.out.println(a.annotationType().getName()); 
} 
+1

(注釈はインタフェースなので、インスタンスは具体的な実行時クラスにはなりません) –

+0

これは間違っています。インタフェースには依然として関連付けられたClassオブジェクトがあります。 – Jherico

+1

@Jherico、それは当てはまりますが、実際の実行時インスタンスはgetClass()メソッドの結果としてインタフェースを持ちません。 – Yishai

1

あなたがソースコードに注釈を追加すると、Javaが実際に制限を使用して注釈については、プログラムの事をお願いします(または、あなたのツール)を可能にし、「フードの下」のインターフェースとクラスの束を作成します。メソッドアノテーションは「ダイナミックプロキシ」を作成するため、JavaはおそらくProxyという名前のクラスを作成します。

あなたは、このことに興味がある場合は、java.lang.reflect.InvocationHandlerとそのサブタイプに読み、言われていることAnnotationInvocationHandler

、あなたはJavaが実際に発生するものを心配する必要はありません。私はあなたが正しくJavaプログラム内から注釈を検査するために反射を使用していないと思う。それは、コンパイルを超えて住んでいるようにあなたのアノテーションの

@Retention(RetentionPolicy.RUNTIME) 

1

も。これを設定することを忘れないでください。

関連する問題