字段表集合
字段表(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
access_flags用来存储变量的权限修饰符,它与类中的访问标志(access_flags)非常的类似,都是一个u2类型的数据。
name_index
name_index表示field的名称(字段名)
descriptor_name
descriptor_name是field的类型描述符(字段类型描述符),作用:用来描述字段的数据类型,方法的参数列表(包括数量,类型和顺序)和返回值,
对于数组类型,每一个维度将使用一个"[“字符来描述,如二维数组 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结构
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虚拟机》