前言

本文会对Java的四种访问级别进行总结,以及解释访问权限在类加载的哪一步实施。

(若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正)

四种访问级别

Java中有四种访问级别,分别是private、protected、缺省和public,它们之间的访问级别区别如下表所示:

Modifier

Class

Package

Subclass

World

public

Y

Y

Y

Y

protected

Y

Y

Y

X

no modifier

Y

Y

X

X

private

Y

X

X

X

但这些访问级别在虚拟机类加载的哪个过程会对方法或变量的访问进行限制?

虽然在《Java的继承(深入版)》简单介绍了类加载过程,而在访问级别在虚拟机中的应用,在类加载过程中的验证阶段:

我们来挨个看看验证阶段包括的几个检验动作:文件格式验证、元数据验证、字节码验证、符号引用验证。

文件格式验证

第一阶段首先要验证字节流是否符合Class文件格式的规范,也就是看看这文件能不能被JVM处理。可能会有以下验证点:

是否以魔数0xCAFEBABE开头(关于魔数可见详情于《深入理解Java虚拟机》)

主、次版本号是否在当前虚拟机处理范围之内(主、次版本指Java的版本)

常量池的常量中是否有不被支持的常量类型(检查常量tag标志)

指向常量的各种索引值中是否有指向不存在的常量或不符合类型的常量。

…(其实检查的大多是字节码文件的内存,关于字节码详情可见《深入理解Java虚拟机》的第六章)

元数据验证

第二阶段是对字节码描述的信息进行语义分析,保证其中的信息符合Java的语言规范。可能会有以下验证点:

这个类是否有父类(除了Object类之外,所有的类都应该有父类)

这个类的父类是否继承了不允许被继承的类(被final修饰的类)

如果这个类不是抽象类,是否实现了其父类或接口之中要求实现的所有方法

类中的字段、方法是否与父类产生矛盾(如覆盖了父类的final字段,或者出现不符合规则的方法重载,如方法参数都一致,但返回值类型却不同等)

…(其实检查的是有没有存在不符合Java语言规则的元数据信息,其实也就是对元数据中的数据类型进行校验)

字节码验证

第三阶段是通过数据流和控制流分析,确定上面检查好的字节码信息的语义是合法的、符合逻辑的。可能有以下验证点:

保证任意时刻操作数栈(虚拟机栈的栈帧中的一种结构)的数据类型与指令代码序列都能配合工作

保证跳转指令不会跳转到方法体以外的字节码指令上

保证方法体的类型转换是有效

…(此阶段只要对类的方法体进行校验,保证被校验类的方法在运行时不会做出危害虚拟机安全的事件)

符号引用验证

最后一个阶段的校验发生在虚拟机将符号引用转化为直接引用的时候,这个转化动作将在连接的第三阶段——解析阶段中发生(解析即虚拟机将常量池内的符号引用替换为直接引用的过程,符号引用可以即表示特定数据的替身)。也就是说,符号引用校验是对类自身以外的信息进行匹配性校验。可能会有以下验证点:

符号引用中通过字符串描述的全限定名是否能找到对应的类

在指定类中是否存在符号方法的字段描述符以及简单名称所描述的方法和字段

符号引用中的类、字段、方法的访问性(private、protected、default、public)是否可被当前类访问

…(此阶段就是要确保解析动作能够正常进行)

破案了,访问权限是在类加载过程中的符号引用验证中施行。

结语

虽然访问级别是很基础的Java知识,但是越基础的知识,其背后的原理可没那么简单,本文也只是在JVM的基础上对它们稍作解释,奈何水平不够,暂时没能力继续往下深入…

如果觉得文章不错,请点一个赞吧,这会是我最大的动力~

参考资料:

《深入理解Java虚拟机》

java级别_Java的访问级别(深入版)相关推荐

  1. java级别_Java中的四种访问级别

    在Java中,针对类.成员方法和属性提供了四种访问级别,分别是private.default.protected和public.接下来通过一个图将这四种控制级别由小到大依次列出,如图1所示. 图1 访 ...

  2. error:java:无效的源发行版_IDEA java出现无效的源发行版14解决方案_java

    这篇文章主要介绍了IDEA java出现无效的源发行版14解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题描述 问题原因 出现该问题的原 ...

  3. java8.0 platform图_Java Platform SE binary语言-Java编程32位/64位版(jdk-jeb)下载V8.0.2510.8官方安装版-西西软件下载...

    Java编程32位/64位版(jdk-jeb)是一款功能强大的计算机编程语言工具,Java技术让您可以在安全的计算环境下工作和游戏.使用 Java您可以畅玩网络游戏.与世界各地的朋友聊天.计算按揭利息 ...

  4. Java面向对象编程(第2版)_学习记录

    <Java面向对象编程(第2版)> 孙卫琴 编著 文章目录 一.介绍 (一)平台与开发环境 (二)一些知识 (三)数组 二.类的生命周期 (一)类的加载 1. 加载 2. 连接 3. 初始 ...

  5. [转载] Java面试题大全(2020版)

    参考链接: Java中的循环 发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 博主已将以 ...

  6. 面试题:460道Java后端面试高频题答案版「模块九:Spring」

    Spring 写在前面 相信对于 Spring 这个模块,只要是做过 Java 开发的同学都是不陌生的,或多或少都使用过 Spring 体系的框架.对于平时自己做点小项目会写配置文件可能就行了,但是对 ...

  7. 狂刷《Java权威面试指南(阿里版)》,助你一臂之力,事半功倍

    莫慌莫慌,"面试造火箭,工作拧螺丝" 说得不无道理,偶然从朋友那得到的这份Alibaba内部疯传<Java权威面试指南(阿里版)>堪称精品,或可能助你一臂之力,事半功倍 ...

  8. 这份 Alibaba 内部疯传《Java 权威面试指南(阿里版)》堪称精品,面试助你一臂之力,事半功倍

    今年金三银四.金九银十情况都不太好,很多小伙伴都没找到工作,不少小伙伴都在经历了这个惨痛的寒冬后开始暗戳戳的备战明年的金三银四了,"面试造火箭,工作拧螺丝" 说得不无道理,偶然从朋 ...

  9. Java面试题大全(2020版)

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 本套Java面试题大全,全的不能再全,哈哈~ 博主已将以下这些面试题整理成了一个Jav ...

最新文章

  1. 深入了解JavaScript对象(2)--函数、对象
  2. Response对象学习
  3. JavaScript模板引擎原理,几行代码的事儿
  4. 1660s功耗多少w_1660显卡要多大电源?GTX1660用多大电源合适
  5. 创新将会出现在云端,边缘还是其他地方?
  6. 买基金你们都亏了多少钱?
  7. Bugku杂项小猪佩奇思路
  8. oc实时渲染的图如何导出_一键AO插件拯救你的白模分析图(附插件和教程)
  9. VC++2010Express下载
  10. python打印上下标
  11. GB码和BIG5码的互换技术-foxpro版-摘自csdn-faq
  12. [Vue warn]: You may have an infinite update loop in watcher with express
  13. python加权随机_Python中的加权随机
  14. 微信小程序播放音乐(仿QQ音乐)
  15. 是不是程序员总会遇到一个瓶颈期,觉得自己没有进步了,该怎么解决?
  16. oracle存储过程报错:ORA-06550: wrong number or types of arguments in call to
  17. 全网第一 | Flink学习面试灵魂40问答案,文末有福利!
  18. c++ socket 多线程 网络聊天室
  19. High work stress makes you feel anxiety and it can lead you ill
  20. 【JZOJ B组】【NOIP2013模拟】小喵喵的新家

热门文章

  1. element-ui主表格多选后 二级弹框表格默认全选数据
  2. 采用dlopen、dlsym、dlclose加载动态链接库
  3. linux检查哪些进程消耗io,Linux 不同方法查看进程消耗CPU IO 等
  4. 网页跳转出现内部服务器错误,页面跳转后提示HTTP异常500(InternalServerError):服务器尝试执行请求时遇到了意外情况...
  5. java 文件追加 变大_用java写在doc中追加内容代码时,为什么它只能写入一次内容,后面都只是增加文件的大小,不增加内容啊?...
  6. html弄多个按钮_如何为HTML / CSS页面添加更多按钮?
  7. 这是一份简易的ACM模板
  8. HDOJ水题集合4:杂题
  9. Codeforces上通过数超过5W人的题
  10. C++文本处理造轮子