前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Class文件结构介绍[字段表集合和方法表集合]

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

作者头像
用户4919348
发布2019-04-02 10:57:27
1K0
发布2019-04-02 10:57:27
举报
文章被收录于专栏:波波烤鸭波波烤鸭

字段表集合

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

代码语言:javascript
复制
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" 例如

代码语言:javascript
复制
private static final String NAME="bobo";
private String users[][];
private int age = 18;
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

方法表集合

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

代码语言:javascript
复制
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 方法描述符,描述方法的参数类型返回值等。描述方法规则 参数列表在前返回值在后

代码语言:javascript
复制
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虚拟机》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字段表集合
  • 方法表集合
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档