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[];//}
3.符号类型各种常量
常量类型 tagCONSTANT_Class_info 7 类或接口符号引用Fieldref 9 字段Methodref 10 类中方法InterfaceMethodref 11 接口中方法引用String 8 字符串类型字面量Integer 3 整数Float 4Long 5Double 6NameAndType 12 字段与字段类型,方法和方法类型的符号引用Utf8 1 utf字符串//后面三个是java动态语法的基础,lambda表达式的基础MethodHandle 15 方法处理信息MethodType 16 方法类型InvokeDynamic 18 动态方法调用点
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个 //没有实例化不放到常量池,没有newHashSet[] 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.Object3. 基类