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

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


字段表集合

 字段表(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
  }
}

image.png

field_info(字段表)结构

image.png

image.png

access_flags

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

image.png

name_index

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

image.png

descriptor_name

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

image.png

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

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

image.png

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

image.png

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

方法表集合

 方法表和字段表很相似,如果字段表弄清楚了那么方法表也很简单,先来看下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);
  }
}

image.png

方法表的结构

image.png

access_flags结构

image.png

name_index

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

image.png

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;
  }
}

image.png

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


相关文章
|
1月前
|
存储 C++ 索引
哈希表、集合、映射
哈希表、集合、映射
|
1月前
|
索引
单列集合顶层接口Collection
单列集合顶层接口Collection
21 1
|
Java 编译器 索引
JVM虚拟机-Class文件之字段表集合
JVM虚拟机-Class文件之字段表集合
JVM虚拟机-Class文件之字段表集合
|
Java 索引
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
JVM虚拟机-Class文件之类索引、父类索引和接口索引集合
JVM虚拟机-Class文件之方法表集合
JVM虚拟机-Class文件之方法表集合
JVM虚拟机-Class文件之方法表集合
实现两个不同实体类的list相同属性字段互拷
实现两个不同实体类的list相同属性字段互拷
List中根据某个实体的属性去重或者排序
List中根据某个实体的属性去重或者排序
202 0
|
Oracle 关系型数据库
ORA-01779: 无法修改与非键值保存表对应的列
ORA-01779: 无法修改与非键值保存表对应的列
ORA-01779: 无法修改与非键值保存表对应的列