2012-03-23 5 views
5

私はクラスファイルtest.classを持っています。このファイルには、@Id@Entityのような注釈があります。しかし、field.isAnnotationPresent(Id.class)という方法で注釈をチェックすると、falseが返されます。私はフィールド変数のすべてのフィールドを取得しています。isAnnotationPresent(Id.class)がクラスファイルで機能しない理由

私はどのようなミスをしたのか教えてください。

更新:それは一般的に動作するクラス

File file=new File("D:/test/"); 
URL url=file.toURL(); 
URL[] urls=new URL[]{url}; 
ClassLoader loader=new URLClassLoader(urls); 
Class cls=loader.loadClass("com.net.test.Test"); 
+0

あなたに適していないコードを表示できますか? –

答えて

1

あなたのテストのクラスローダが異なるIdloaderより年代を有することができます。チェックする

簡単な方法:

... 
Class idType = loader.loadClass("my.package.Id"); 
... 
field.isAnnotationPresent(idType); 

それが動作する場合は、クラスローダの問題を抱えている - より具体的に、あなたのloaderは、テストケースのローダーを使用していません。あなたは春AOPインターセプターとproxyTargetClass =偽でisAnnotationPresent()を使用している場合は

ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader()); 
+0

あなたは正しく私はClassLoaderのコンストラクタを変更しました。 – elvisanandkumar

1

を取得するには、次のコードを使用しています。具体的な例を示します:

import java.lang.reflect.Field; 

public class AnnotationTest { 

    @Deprecated 
    public static int value = 1; 

    public static void main(String[] args) throws Exception { 
     Field field = AnnotationTest.class.getField("value"); 
     System.out.println(field.isAnnotationPresent(Deprecated.class)); 
    } 
} 

クラス名とインポートを再度確認してください。おそらく間違ってId.class(nameclash)が間違っていないかどうかを確認してください。

25

アノテーションに保存ポリシーを付記しましたか?保持ポリシーが設定されていない場合、デフォルトの保持ポリシー動作は、注釈がコンパイラによって読み込まれ、生成された.classファイルに保持されますが、実行時にはアクセスできなくなります。あなたは、実行時に注釈が必要な場合はあなたがあなたの注釈に注釈を付ける必要があります。

@Retention(RetentionPolicy.RUNTIME) 
+0

'@ Id'と' @ Entity' * do *は 'RetentionPolicy.RUNTIME'を持っています – skaffman

+0

JPAアノテーションですか? –

+1

ありがとう、私は自分のコードでretentionpolicyが不足していて、同様の問題を抱えていました。 – Keshav

0

は、ターゲット・インタフェースの代わりに、実装クラスに注釈を追加:修正するには、別のコンストラクタを使用します。

関連する問題