专栏首页波波烤鸭Class文件结构介绍[字段表集合和方法表集合]

Class文件结构介绍[字段表集合和方法表集合]

字段表集合

  字段表(field_info)用来描述接口或类中声明的变量,字段包括类级别变量以及实例级别变量。但不包括方法内部声明的局部变量。以如下代码来分析

public final  class Test2 implements Serializable,Runnable{

	private static final String NAME="bobo";
	
	private int age = 18;
	
	public void fun1(){
		int b = 20;
		int c = 30;
		int d = b+c+age;
		System.out.println(d);
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
	}
}

field_info(字段表)结构

名称

类型

数量

access_flags

u2

1

name_index

u2

1

descriptor_index

u2

1

attributes_count

u2

1

attributes

attributes_info

attributes_count

access_flags access_flags用来存储变量的权限修饰符,它与类中的访问标志(access_flags)非常的类似,都是一个u2类型的数据。

标志名称

标志值

含义

ACC_PUBLIC

0x0001

字段是否public

ACC_PRIVATE

0x0002

字段是否private

ACC_PROTECTED

0x0004

字段是否protected

ACC_STATIC

0x0008

字段是否static

ACC_FINAL

0x0010

字段是否final

ACC_VOLATILE

0x0040

字段是否volatile

ACC_TRANSIENT

0x0080

字段是否transient

ACC_SYNTHETIC

0x1000

字段是否由编译器自动产生

ACC_ENUM

0x4000

字段是否enum

name_index name_index表示field的名称(字段名)

descriptor_name descriptor_name是field的类型描述符(字段类型描述符),作用:用来描述字段的数据类型,方法的参数列表(包括数量,类型和顺序)和返回值,

标识字符

含义

B

基本类型byte

C

基本类型char

D

基本类型double

F

基本类型float

I

基本类型int

J

基本类型long

S

基本类型short

Z

基本类型boolean

V

特殊类型void

L + 类全限定名 + “;”号

对象类型,如: Ljava/lang/String;

对于数组类型,每一个维度将使用一个"[“字符来描述,如二维数组 java.lang.String[][],将被记录为”[[Ljava/lang/String",int[]将被记录为"[I" 例如

private static final String NAME="bobo";
private String users[][];
private int age = 18;

字段表中包含固定数据项目到descriptor_index为止就结束了,不过在此之后跟随着一个属性表集合用于存储一些额外信息,字段都可以在属性表中描述零至多个额外信息,在上面的三个字段中name为静态常量所以属性表中有信息,如下

具体的属性表下篇文章具体介绍。

方法表集合

  方法表和字段表很相似,如果字段表弄清楚了那么方法表也很简单,先来看下classpy观察的样例结果:

public final  class Test2 {

	private static final String NAME="bobo";
	
	private String users[][];
	
	private int age = 18;
	
	public void fun1(){
		int b = 20;
		int c = 30;
		int d = b+c+age;
		System.out.println(d);
	}
}

方法表的结构

名称

类型

数量

access_flags

u2

1

name_index

u2

1

descriptor_index

u2

1

attributes_count

u2

1

attributes

attribute_info

attributes_count

access_flags结构

标志名称

标志值

含义

ACC_PUBLIC

0x0001

方法是否为public

ACC_PRIVATE

0x0002

方法是否为private

ACC_PROTECTED

0x0004

方法是否为protected

ACC_STATIC

0x0008

方法是否为static

ACC_FINAL

0x0010

方法是否为final

ACC_SYNCHRONIZED

0x0020

方法是否为synchronized

ACC_BRIDGE

0x0040

方法是否是由编译器产生的桥接方法

ACC_VARARGS

0x0080

字段是否接受不定参数

ACC_NATIVE

0x0100

字段是否为native

ACC_ABSTRACT

0x0400

方法是否为abstract

ACC_STRICTFP

0x0800

方法是否为strictfp

ACC_SYNTHETIC

0x1000

方法是否是由编译器自动产生的

name_index 方法定义的名称,注意本案例中我们只定义一个方法"fun1",但是我们发现方法表中有两个方法其中一个<init>是实例的构造器方法。

descriptor_name 方法描述符,描述方法的参数类型返回值等。描述方法规则 参数列表在前返回值在后

public final  class Test2 {

	private static final String NAME="bobo";
	
	private String users[][];
	
	private int age = 18;
	// 描述符 ()V
	public void fun1(){
		int b = 20;
		int c = 30;
		int d = b+c+age;
		System.out.println(d);
	}
	// 描述符; (I[Ljava/lang/String[[I)Z
	public boolean fun2(int name,String[] games,int[][] date){
		return true;
	}
}

参考《深入理解Java虚拟机》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringDataJPA之关联关系

    一个角色可以拥有多个菜单,一个菜单可以分配多个角色。多对多的关联关系 角色:多方 菜单:多方

    用户4919348
  • SpringCloud-Eureka[安全认证]

      在SpringCloud服务中为了提高注册中心的安全性我们可以整合springsecurity来实现完全认证。

    用户4919348
  • Linux之tomcat安装

      Linux上安装tomcat的系统环境只需要安装好jdk即可,然后下载对应的tomcat即可, 官网地址:http://tomcat.apache.org...

    用户4919348
  • 《selenium2 python 自动化测试实战》(9)——切换窗口

    用户2149234
  • VisualStudio 扩展开发 添加菜单

    本文告诉大家如何快速在开发 VisualStudio 的工具里面添加菜单,点击菜单运行自己的代码

    林德熙
  • 【数字图像处理】LeetCode与图像处理(连通域的计算)

    在图像中,最小的单位是像素,每个像素周围有 8 个邻接像素,常见的邻接关系有 2 种:4 邻接与 8 邻接。4 邻接一共 4 个点,即上下左右、8 邻接的点一共...

    机器视觉CV
  • linux之iptables 基础详解

    iptables是Linux系统上的防火墙,是一个包过滤型的防火墙,能够根据事先定义好的检查规则对进出本机或者本地网络的报文进行匹配检查,并对于能够被规则匹配的...

    用户4877748
  • 身临其境的建筑体验:3D打印和人工智能相结合的“星形胶质细胞”

    身临其境的建筑体验:3D打印和人工智能(AI)相结合的“星形胶质细胞” 加拿大建筑公司菲利普·比斯利建筑师公司(Philip Beesley Architect...

    企鹅号小编
  • Spring Security 实战干货:客户端OAuth2授权请求的入口在哪里

    在Spring Security 实战干货:OAuth2 第三方授权初体验一文中我先对 OAuth2.0 涉及的一些常用概念进行介绍,然后直接通过一个 DEMO...

    码农小胖哥
  • CS学习笔记 | 26、杀毒软件

    这一节将来看看杀毒软件相关的概念,毕竟知己知彼才能百战不殆,最后会介绍一下常见的免杀方法。

    TeamsSix

扫码关注云+社区

领取腾讯云代金券