JVM-访问标志

  访问标志

  在前面分析了 class文件的魔数,次版本号,主版本号,常量池入口,常量池,那么在常量池结束后,紧接着的两个字节代表访问标志(access_flages).这个标志用于识别一些类或者接口层次的访问信息,包括:这个class是类还是接口,是否定义为public类型,是否定义为abstract类型,如果是类的话,否被声明为final等.

  访问标志及其含义具体如下:

  

标志名称  标志值 含义
ACC_PUBLIC 0x00 01 是否为Public类型
ACC_FINAL 0x00 10 是否被声明为final,只有类可以设置
ACC_SUPER 0x00 20 是否允许使用invokespecial字节码指令的新语义.
ACC_INTERFACE 0x02 00 标志这是一个接口
ACC_ABSTRACT 0x04 00 是否为abstract类型,对于接口或者抽象类来说,次标志值为真,其他类型为假
ACC_SYNTHETIC 0x10 00 标志这个类并非由用户代码产生
ACC_ANNOTATION 0x20 00 标志这是一个注解
ACC_ENUM 0x40 00 标志这是一个枚举

  access_flages中共有两个字节(16位)可以使用,没有使用到的标志为要求一律为0.

接下来继续把前面的例子往下分析:

源代码:

class文件:

  这个图中,继常量池后,又分析了访问标志.

  分析中 0x00 01 和 0x00 20 是通过上面的访问标志表的到的,对应着ACC_PUBLIC和ACC_SUPER .由于只用这两个标志位为1,其他标志位为0,把各个标志为的值和标志本身的值相与之后,再做或计算,就可以计算出整个访问标志的值了.0x00 01 | 0x00 20 = 0x00 21.

时间: 2024-10-28 23:51:46

JVM-访问标志的相关文章

Jvm(36),class文件结构----访问标志

access_flags中一共有32个标志位可以使用,当前只定义了其中的8个,没有使用到的标志位要求一律为0. package org.fenixsoft.clazz: public class TestClass{ private int m: public int inc(){ return m+1: }} access_flags中一共有16个标志位可以使用,当前只定义了其中8个[1],没有使用到的标志位要求一律为0.以代码清单6-1中的代码为例,TestClass是一个普通Java类,不

【JVM虚拟机】(6)---深入理解Class中访问标志、类索引、父类索引、接口索引

JVM(6)访问标志,类索引 上一篇博客讲[JVM虚拟机](5)---深入理解JVM-Class中常量池 我们知道一个class文件正常可以分为7个部分: 魔数与class文件版本 常量池 访问标志 类索引.父类索引.接口索引 字段表集合 方法表集合 属性表集合 那么这篇博客主要讲有关 访问标志 和 类索引.父类索引.接口索引 相关的理解和代码示例. 先通俗的说下这两个的作用: 访问标志: 告知该类是一个什么类型的类,是普通类?还是接口?还是枚举?或者其它类,是用什么修饰符修饰该类的. 类索引.

《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合

讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了.现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志.类索引.父类索引.接口索引集合. 1. 访问标志.类索引.父类索引.接口索引集合 在class文件中的位置 好,让我们来一一击破它们,看看它们到底是什么东西. 2. 访问标志(access_flags)能够表示什么? 访问标志(access_flags)紧接着常量池后,占有两个字节,总共16位,如下图所示: 当JVM在编译某个类或者接口的源代码

访问标志

class文件中用两个字节共16位代表访问标志(access flags),用于表明该类或接口被访问时能提供的一些信息: 标志名称 标志值 含义 ACC_PUBLIC 0x00 01 是否为Public类型 ACC_FINAL 0x00 10 是否被声明为final,只有类可以设置 ACC_SUPER 0x00 20 是否允许使用invokespecial字节码指令的新语义. ACC_INTERFACE 0x02 00 标志这是一个接口 ACC_ABSTRACT 0x04 00 是否为abstr

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

java jvm学习笔记十二(访问控制器的栈校验机制)

欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们会简单的描述一下jvm访问控制器的栈校验机制. 这节课,我们还是以实践为主,什么是栈校验机制,讲一百遍不如你自己实际的代码一下然后验证一下,下面我们下把环境搭起来. 第一步,配置系统环境.(copy吧,少年) path=%JAVA_HOME%/bin JAVA_HOME=C:/Java/jdk1.6

JVM中class文件探索与解析(一)

一直想成为一名优秀的架构师的我,转眼已经工作快两年了,对于java内核了解甚少,闲来时间,看看JVM,吧自己的一些研究写下来供大家参考,有不对的地方请指正. 废话不多说,一起来看看JVM中类文件是如何加载和运行的. (1)首先,编写简单代码,对其编译生成的class文件进行研究,其java代码如下: 1 public class test { 2 private static int count = 0; 3 public static void recursion(){ 4 count++;

Java核心:类加载和JVM内存的分配

类的加载: 指的是将class文件的二进制数据读入到运行时数据区(JVM在内存中划分的) 中,并在方法区内创建一个class对象. 类加载器: 负责加载编译后的class文件(字节码文件)到JVM(Java虚拟机)当中. 而类加载器主要分为以下几种: 1.Bootstrap class loader (引导类加载器) 负责加载Java核心类库.在jre\lib目录下,包括rt.jar(Java基础类库),这些 都是Java的核心类库.而且这个加载器是由C语言编写的,所以在Java程序中是获取 不

深入理解JVM读书笔记: Class类文件结构

Class文件是一组以8位字节为基础单位的二进制流.采用一种类似于C语言结构体的微结构来存储数据,只有两种数据类型:无符号数和表.其中无符号数数据基本的数据类型,以u1.u2.u4.u8表示1.2.4.8字节的无符号数,用于描述数字.索引引用.数量值或者UTF-8编码字符串:表则是由无符号树和其他表的复合数据类型,以_info后缀.整个Class文件本质上就是一张表: 解析Class文件各个数据项含义: 魔数 头4个字节为魔数Magic Number,唯一作用是识别文件是否能被虚拟机接受. 版本

JVM学习笔记

看的<深入理解Java虚拟机> ---------------Java内存区域------------- 一.运行时数据区域 1.Java虚拟机管理的内存包括的运行时数据区:程序计数器Program Couter Register,虚拟机栈VM Stack,本地方法栈Native Method Stack,堆Heap,方法区Method Area.2.程序计数器:当前线程所执行的字节码的行号指示器.字节码解释器工作时通过改变计数器的值来选取下一条需要执行的字节码指令,分之.循环.跳转.异常处理