Java批注看不到同一批注类的私有字段

时间:2019-01-29 15:29:10

标签: java spring annotations

我遇到奇怪的事情。我有一个Spring控制器,我想在其中定义字段的同一类中将private static字段用作注释参数。根据我的常识,我想知道为什么以下代码段是错误的。

@RestController
@RequestMapping(ApplicationController.BASE_URL)
public class ApplicationController implements ApplicationAPI {

    private static final String BASE_URL = "/api/application/v1";

    // endpoints skipped
}
  

BASE_URL在my.company.api.application.controller.ApplicationController

中具有私有访问权限

一旦我将可见性更改为至少 package-friendly ,该字段就会被识别。为什么会发生这种奇怪的行为,其原因是什么?

2 个答案:

答案 0 :(得分:1)

由JLS指定。

来自JLS§6.6.1. Determining Accessibility

  

仅当可访问类型且成员或构造函数为可访问类型时,才可以访问引用类型的成员(classinterface,字段或方法)或类类型的构造函数。声明允许访问:

     
      
  • 如果成员或构造函数被声明为public,则允许访问。
  •   
     

缺少访问修饰符的所有接口成员都是隐式public

     
      
  • 否则,如果将成员或构造函数声明为受保护的,则仅当以下条件之一为真时才允许访问:

  •   
    •   
    • 从包含声明受保护的成员或构造函数的类的包中访问成员或构造函数。
    •   
  •   
    •   
    • 如第6.6.2节所述,访问是正确的。
    •   
  •   
  • 否则,如果使用包访问权限声明成员或构造函数,则仅当在声明了该类型的包中进行访问时才允许访问。

  •   
     

声明没有访问修饰符的类成员或构造函数隐式具有包访问权限。

     
      
  • 否则,将成员或构造函数声明为private,并且仅当在包含成员声明的顶级类型(第7.6节)的主体中进行访问时,才允许访问或构造函数
  •   

对于您来说,private成员的访问发生在包含声明的顶级类型主体之外,并且被拒绝

答案 1 :(得分:0)

基本上是因为您试图访问在容器类上下文之外具有私有可访问性的字段。从字面上看,发生这种情况是因为您尝试进行的访问在class块之外。