2013-03-02 49 views
0

我在查找類的列表以檢查類是否具有Annonation。這是代碼:類#isAnnotationPresent不起作用

     if (clazz.getAnnotations().length > 0){ 
          System.out.println(clazz.getAnnotations()[0]); 
         } 
         if (clazz.isAnnotationPresent(Manifest.class)){ 
          System.out.println(clazz.getName()); 
         } 

第一條if語句僅用於調試。一類打印:

@bot.script.Manifest(description=test, version=1.0, name=test) 

這與Manifest.class完全相同,但爲什麼clazz.isAnnotationPresent不起作用?

+0

您確定您在兩種情況下都在尋找相同的「Manifest」類嗎? – 2013-03-02 12:45:57

+0

是的,它打印:bot.script.Manifest。我已經爲Manifest.class導入了bot.script.Manifest – 2013-03-02 12:47:02

+2

你有幾個類加載器嗎?什麼'System.out.println(class.getAnnotations()[0] .getClassLoader())'和'System.out.println(Manifest.class.getClassLoader())'print?這兩個班級裝載機是一樣的嗎? – 2013-03-02 12:51:49

回答

1

從評論,它看起來像你有幾個類裝載機。註解類和其Manifest註釋由第一個類加載器加載,並且包含您問題中if測試的類由第二個類加載器加載,並使用第二個類加載器重新加載Manifest類。

因此,您測試Manifest.class是否與clazz.getAnnotations()[0]相同,但它們不是,因爲雖然它們具有相同的名稱,但它們是兩個不同的類,因爲它們是由兩個不同的類加載器加載的。

很難告訴你如何解決這個問題,因爲我們不知道你的應用程序做了什麼,它是如何做以及在哪個環境中。但是你應該確保只有一個類加載器可以加載這個類。例如,如果運行在webapp中,該類應該位於容器的claspath中,或者位於webapp的類路徑(WEB-INF/classes和WEB-INF/lib/xxx.jar)中,但不能同時存在於兩者中。