学习Java基础知识时,学习到类的继承关系时就会看到一张父子类中,子类能访问父类资源的开闭关系,入下表
类内部 | 同包下 | 子类 | 外部类 | |
public | ✔️ | ✔️ | ✔️ | ✔️ |
protected | ✔️ | ✔️ | ✔️ | × |
default | ✔️ | ✔️ | × | × |
private | ✔️ | × | × | × |
很多年都认为只要是protected修饰的,子类时可以访问的,这个并没有错的,但是今天无意中在一个测试类中想编写以下代码
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:resourceTestXml.xml");
classPathXmlApplicationContext.loadBeanDefinitions();
但是idea并没有提示存在这个方法。这是spring源码中的类,ClassPathXmlApplicationContext的直接父类是AbstractXmlApplicationContext,父类中实现了AbstractXmlApplicationContext父类的父类的抽象方法loadBeanDefinitions方法。
然后我打开已经装载编译好的spring的源码在ClassPathXmlApplicationContext中某一个方法中加入loadBeanDefinitions是可以的,一下子有点懵,protected关键字修饰的方法子类时完全可以调用的为什么上面的代码不行,同在org.springframework.context,support包中,并且是父子类继承关系。然后细细再品味了下上面的表格,访问限制关系。突然发现我编写这行代码的包是我自己创建的包,编写代码的类也不存在父子继承关系,所以不行。
从而明白,这里指的子类其实是指子类内部,如果子类在别的包中,那么子类也是看不见这个方法的,或者没有权限,因为不在一个包下。这样其实就很好的封装和保护了spring底层源码。
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory);