2013-10-14 31 views
1

我試圖將彈簧@Controller的baseurl外化爲控制器類的靜態String成員。如果我這樣做,我必須宣佈成員公開 - 否則它將不可見的@RequestMapping註釋。我不明白爲什麼 - 不是班級的註釋部分?Java類型級別註釋和私有成員可見性

有人可以解釋爲什麼我不得不在這裏使用private

無效:

@Controller 
@RequestMapping(PendingApprovalsController.CONTROLLER_URL) 
public class PendingApprovalsController { 
    private static final String CONTROLLER_URL = "/some/url"; 
     ... 
} 

有效期:

@Controller 
@RequestMapping(PendingApprovalsController.CONTROLLER_URL) 
public class PendingApprovalsController { 
    public static final String CONTROLLER_URL = "/some/url"; 
     ... 
} 

回答

3

註釋是一個普通的Java類本身。它使用普通的Java規則不能看到註釋類的成員,除非它們是可見的。此外,註釋的存在可能被運行時的其他代碼用於對註釋類的成員進行操作;如果這些成員不可見,則這些操作不能執行。

This page來自JDK文檔包討論瞭如何定義自定義註釋以及如何使用代碼中應用的註釋,並且在這方面具有啓發性。要定義註釋類型,請執行以下操作:

public @interface Copyright { 
    String value(); 
} 

您的自定義註釋被定義爲特殊類型的Java接口;在用戶中,JVM根據需要提供運行時實現。但要注意的關鍵是你如何使用您的自定義的註釋,例如:

Method m = ... // Get a java.lang.reflect.Method object from somewhere 
if (m.hasAnnotation(Copyright.class)) ... 

注意,這裏我們指的是註釋類型的類對象,表明註釋編譯爲一個普通的Java類型。

+0

你確定註釋是語言意義上的類嗎?我無法實例化它們。 –

+0

我添加了一些關於此的附加材料。 –