2017-09-21 54 views
1

annoted類存在以下MYSAMPLE項目中從罐子無法獲取來自JAR文件註釋瓦萊斯顯示

@Description(name = "foo", description = "bar") 
public class Test { 

    ////// 

} 

抓取瓦萊斯在下面的代碼

File file = new File("MySample.jar"); 
    URL url = file.toURL(); 
    URL[] urls = new URL[]{url}; 

    ClassLoader cl = new URLClassLoader(urls); 
    Class cls = cl.loadClass("com.example.Test"); 
    Description annotations = cls.getClass().getAnnotation(Description.class); 

    // annotations instance is null 

因爲註釋實例的空我不能夠取值。

有沒有人有想法如何解決這個問題或任何其他的替代品?

+0

您確定'Test'類和Description.class中的@Description是完全限定名的同一類嗎? –

+0

兩者都是同一類 –

回答

0

首先,確保Description@Retention(RetentionPolicy.RUNTIME)

如果你已經有了這個,會發生什麼是兩個不同的類加載器正在加載Description類。第一個是您創建的URLClassLoadercl),第二個是您的常規應用程序類加載器。當你打電話給getAnnotation(Description.class)時,你可以請求cl加載的類加載應用程序加載的註解類。加載器,並且由於類是由它們的加載程序標識的,所以這兩個實際上是完全不同的類,所以比較失敗並且沒有結果。

現在,問題在於你爲什麼要以這種複雜的方式加載這個jar?爲什麼你需要你自己的類加載器實例?

如果您試過類似:ClassLoader cl = this.getClass().getClassLoader()這可能會工作。但只有在運行時將jar id添加到類路徑中才有意義。

否則,Test.class.getAnnotation(Description.class)(沒有類加載器業務)會更有意義。