【笔记】第一次对比java源码与class文件
这里是写的函数的源码public void startLogin(int n, String string, long l, String string2, byte[] byArray, int n2, boolean bl) {
String string3 = String.valueOf(l) + "=" + string2;
byte[] byArray2 = string3.getBytes();
this.ccc(byArray2, (byte)1);
}
这里是class文件并进行的注释
DEFINE PUBLIC startLogin(I 1, Ljava/lang/String; 2, J 3, Ljava/lang/String; 5, [B 6, I 7, Z 8)V
A:
LINE A 15
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init>()V
LLOAD 3 //参数1,最上面的J 3
INVOKESTATIC java/lang/String.valueOf(J)Ljava/lang/String; //调用静态方法valueOf,返回类型为 Ljava/lang/String;。将J 3变成了String
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; //调用函数append,参数为上一步的String
LDC "=" //参数1,文本型
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; //调用函数append,参数为上面的 “=”
ALOAD 5 //参数1,Ljava/lang/String; 5
INVOKEVIRTUAL java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder; //调用函数append,将 Ljava/lang/String; 参数为上面的5
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String; //调用函数,toString(),返回类型为 Ljava/lang/String;
ASTORE 9 //将返回结果压入变量9
B:
LINE B 16
ALOAD 9 //参数1,变量9
INVOKEVIRTUAL java/lang/String.getBytes()[B //调用函数getBytes(),返回类型为[B
ASTORE 10 //将返回结果压入变量10
C:
LINE C 18
ALOAD this //调用对象自身
ALOAD 10 //参数1,变量10
ICONST_4 //参数2,4(int)值入栈。
INVOKEVIRTUAL tmp/aaa.ccc(
D:
LINE D 20
RETURN
/**
每一行代码对应一个字母加冒号,最后的D:应该是编译时自动添加的return
参考资料,百度搜索 java汇编指令大全
*/
页:
[1]