1.常量池总数(存放一堆常量)(第一个可变长的结构)
//两个字节 u2 constant_pool[constant_pool_count-1] 范围在[1,n-1]
//第一个位置不存常量,保留保留索引(特殊情况下使用)
//所以5个常量 范围在 [1,6]中
2.常量池
1.jvm指令依赖常量池表中的符号信息() 2.常量组成(与java常量区别) 1.字面量Literal(字符串,final的常量值final int final float....) 2.符号引用 #123 类与接口的全限定名称top.jamsee.App (包名+类名) 字段的名称(变量的名称)和 ???描述符 3.cp_info的展开 cp_info constant_pool[constant_pool_count-1] cp_info{ u1 tag;//标志是哪一种常量 u1 info[];// }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3.符号类型各种常量
常量类型 tag CONSTANT_Class_info 7 类或接口符号引用 Fieldref 9 字段 Methodref 10 类中方法 InterfaceMethodref 11 接口中方法引用 String 8 字符串类型字面量 Integer 3 整数 Float 4 Long 5 Double 6 NameAndType 12 字段与字段类型,方法和方法类型的符号引用 Utf8 1 utf字符串 //后面三个是java动态语法的基础,lambda表达式的基础 MethodHandle 15 方法处理信息 MethodType 16 方法类型 InvokeDynamic 18 动态方法调用点
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
4.常量–>符号表类型–>描述符
1.字段描述符 (表示类,对象,局部变量的数据类型)
- B代表 byte
C代表 char
D double
F float
I int
J Long
L ClassName(类的名称) 类的实例
S short
Z boolean
[ reference 代表一个一维数组
[[ 二维
V void 没有返回值 例子:
int a; //描述符是 I
Ljava/lang/object; //object类型的实例,加包名
[[[D //表示三维数组double d[][][]
2.方法描述符(来描述方法的信息)
- 1.方法名不会描述
2.this不会描述,由jvm指令描述
3.类方法和实例方法描述符一样
例如:
Object aa(int i,double d,Thread t){} //返回值描述在后面
(IDLjava/lang/Thread;)Ljava/lang/Object
5.javap(看二进制已经不满足看到常量的)(java官方给的)(服务器上查看)
//cmd cd到out目录
javap -v Stu.Class #输出附加信息,类信息,可以看常量池
6.另外的一个查看工具idea的插件 jclasslib Bytecode Viewer(初学者看熟悉看javap)
选中文件 view--> show bytecode
------14个常量(有不同数据结构)-------
7.CONSTANT_Class_info
CONSTANT_Class_info{
u1 tag;
u2 name_index; //存 #14到14这个utf常量 com/jamsee/app/Stu
} //类/接口中(静态块,方法中,抛异常,数组)使用其他类,也会添加到这个常量中(数量变多)
public void func2() throws Throwable{}
HashSet[] hashsets=new HashSet[10];//也会放,维度小于255个 //没有实例化不放到常量池,没有new
HashSet[] hashsets;
8.符号表实际上是数组的下标 #14像mysql的外键
9.继承怎么办 //点击常量池,可以选上过滤,可以方便看
1.常量池只会显示他直接继承的类,不会显示祖宗Object类
例如: class Teacher extends Person{} #常量池有两个常量,一个是他自己,另外一个是Person
2.抽象类和类一样
public abstract class xxx{}
3.接口(面试题) 也是有Object和自己的全限定名称
面试题: 接口的父类是不是Object?
接口没有父类,接口可以多继承IA,IC
通过extends 可以看出Object不是直接父类(如果是Object,不会显示出来)
Object在接口里面引用,就是在接口new出来
interface IA{ Object obj=new Object();}
10.枚举(也是类)在CONSTANT_Class_info常量查看
public enum my{
}
1.有4个常量
1.他自己<[Ltop/jamsee/myE;> //(2个) 多一个[ 代表数组
2..他自己
3.枚举对象 Enum
11.注解
public @interface aa{ }
3个常量
1.自己的包名
2.Object
3. 基类