2012-04-05 75 views
8

如果某個類使用註釋進行了註釋,那麼該註釋的定義是否必須位於運行時類路徑中才能使用該類?例如,給定註解運行時類路徑中是否需要註記類文件?

import java.lang.annotation.ElementType; 
import java.lang.annotation.Target; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Retention; 
@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Component {} 

我可以執行該程序

@Component 
public class Test { 
    public static void main(String[] args) { 
     System.out.println("It worked!"); 
    } 
} 

而不在類路徑具有Component.class? (在我的測試中,我可以,但這是行爲定義的行爲?)

我問,因爲有conflicting claims是否使用庫中的註釋創建對該庫的依賴關係。

+0

相關鏈接:http://mail.openjdk.java.net/pipermail/type-annotations-dev/2011-November/000079.html,https://bugs.eclipse.org/bugs /show_bug.cgi?id=366063(供將來快速參考) – Jayan 2012-04-05 17:40:38

+3

可能的複製:http://stackoverflow.com/questions/3567413/why-doesnt-a-missing-annotation-cause-a-classnotfoundexception-at-runtime – 2012-04-05 18:27:05

+0

感謝馬特,那正是我所尋找的。 – meriton 2012-04-05 19:07:09

回答

4

運行時註釋是要在運行時由註釋處理器處理的元信息。如果在運行時有權訪問註釋,那麼您肯定會在類路徑中添加註釋。例如junit肯定需要類路徑中的註釋來確定測試方法。

如果沒有完成註釋處理,則不需要使用類路徑。

我期望即使是AccessibleObject.getAnnotations()也會導致異常。對類路徑中的註釋類型是安全的。

+1

AccessibleObject.getAnnotations()不會在類路徑中導致缺少註釋的異常 - http://bugs.java.com/view_bug.do?bug_id=6322301 – kodstark 2017-11-10 10:31:27