在网上看到类似的一个帖子,稍微总结学习一下。字节码详解
package com.test;
public class Test1 {
public void test1() {
int a = 1;
int b = 2;
int c = -1;
int d = -2;
}
public void test2() {
int a = 5;
int b = 6;
int c = -5;
int d = -6;
}
public void test3() {
int a = 32767;
int b = 32768;
int c = -32768;
int d = -32769;
}
public void test4() {
int a = 65535;
int b = 65536;
int c = 65536;
int d = -65535;
int e = 65536;
}
}
Compiled from "Test1.java"
public class com.test.Test1 extends java.lang.Object{
public com.test.Test1();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void test1();
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iconst_m1
5: istore_3
6: bipush -2
8: istore 4
10: return
public void test2();
Code:
0: iconst_5
1: istore_1
2: bipush 6
4: istore_2
5: bipush -5
7: istore_3
8: bipush -6
10: istore 4
12: return
public void test3();
Code:
0: sipush 32767
3: istore_1
4: ldc #22; //int 32768
6: istore_2
7: sipush -32768
10: istore_3
11: ldc #23; //int -32769
13: istore 4
15: return
public void test4();
Code:
0: ldc #25; //int 65535
2: istore_1
3: ldc #26; //int 65536
5: istore_2
6: ldc #26; //int 65536
8: istore_3
9: ldc #27; //int -65535
11: istore 4
13: ldc #26; //int 65536
15: istore 5
17: return
}
public void test1();
Code:
0: iconst_1
// 操作数栈 压入1
1: istore_1
// 把操作数栈栈顶值弹出,存入栈帧中的局部变量第一个数组中
2: iconst_2
// 操作数栈 压入2
3: istore_2
// 把操作数栈栈顶值弹出,存入栈帧中的局部变量第二个数组中
4: iconst_m1
// 将int型-1 压入至栈顶
5: istore_3
// 把操作数栈栈顶值弹出,存入栈帧中的局部变量第三个数组中
6: bipush -2
// 将int型-2 压入至栈顶
8: istore 4
// 把操作数栈栈顶值弹出,存入栈帧中的局部变量第三个数组中
10: return
// 方法执行完成 ,返回
a,b,c和d是直接从指令获取数值,而没有进行栈中交换或进入常量池。
public void test2();
Code:
0: iconst_5
// 将int型5 压入至栈顶
1: istore_1
// 把操作数栈栈顶值弹出,存入栈帧中的局部变量第一个数组中
2: bipush 6
// 将单字节的常量值(-128~127)6压入至栈顶,直接给变量。
4: istore_2
// 把操作数栈栈顶值弹出,存入栈帧中的局部变量第二个数组中
5: bipush -5
7: istore_3
8: bipush -6
10: istore 4
12: return
JAVA虚拟机对常用常量(比如0,1,2,3,4,5)的操作直接定义成了指令,而不是传统的操作指令后带操作数。 目的是减少指令长度。没有iconst_6的指令! 而是bipush 6,就是传统的指令+操作数。
a,b,c和d是直接直接给变量
public void test3();
Code:
0: sipush 32767
// 将一个短整型常量值(-32768~32767)压入到栈顶,32767占用两个字节,sipush命令栈用
// 一个字节,所有istore_1从3开始。
3: istore_1
// 把操作数栈栈顶值弹出,存入栈帧中的局部变量第一个数组中
4: ldc #22; //int 32768
// 从常量池中找到数组索引为22的数据,并把该值压入到栈顶栈中
6: istore_2
7: sipush -32768
10: istore_3
11: ldc #23; //int -32769
13: istore 4
15: return
public void test4();
Code:
0: ldc #25; //int 65535
2: istore_1
3: ldc #26; //int 65536
// 从常量池中找到数组索引为26的数据,并把该值压入到栈顶栈中
5: istore_2
6: ldc #26; //int 65536
// 从常量池中找到数组索引为26的数据,并把该值压入到栈顶栈中
8: istore_3
9: ldc #27; //int -65535
11: istore 4
13: ldc #26; //int 65536
15: istore 5
17: return
}
对于65536,大于两个字节的,编译的时候把它放入常量池部分,而把取这个数的指令写为#26,所以说
#26是线程内部可以共享的。
好处是减少了指令代码的长度.这个值可以被多次使用。
所以对于int类型的数据,0-5 直接从指令中得到;-32768~32767 直接给变量;其它的数据放到常量池中,
该范围的数据在线程内部是可共享的。
字节码详解
分享到:
相关推荐
JDK(Java Development Kit)包含了编译器javac和解释器java,它们分别用于将源代码编译成字节码和运行字节码。 通过这个“Java基础精品课01-初识java”,学习者将能够逐步建立起对Java编程的坚实基础,为后续深入...
- **Java跨平台原理**:Java的跨平台特性主要得益于字节码文件(`.class`文件)和Java虚拟机(JVM)。Java程序编译成字节码文件后,由不同平台上的JVM解释执行这些字节码文件,从而实现了“一次编写,到处运行”的...
2. 编译和解释:Java代码首先被编译成字节码,然后在不同的平台上通过JVM(Java虚拟机)进行解释执行。 3. 自动无用内存回收:Java提供了垃圾回收机制,自动管理内存,避免了内存泄漏的问题。 4. 面向对象:Java是...
- **JVM (Java Virtual Machine)**:Java虚拟机,负责解释执行字节码,是Java平台的核心组件。 - **反编译**:指的是将编译后的字节码转换回接近源代码的过程,虽然不能完全还原成最初的源代码,但可以帮助理解...
编译后,这些源代码会被转换成`.class`字节码文件,放在`classes`或`build`目录下。开发者可以通过阅读这些源代码来学习如何在实际项目中应用文件操作。 总结起来,Java中的文件操作涉及到`File`和`Files`类的使用...
通过Java编译器`javac`将源代码文件编译成字节码文件,扩展名为`.class`。 - **第三步:运行** 使用Java虚拟机(JVM)解释执行字节码文件,实现程序的功能。 **4. 编写程序框架** ```java public class Hello...
1. **Java跨平台原理**:Java程序通过编译成字节码(`.class`文件),可以在任何支持Java的平台上运行,这得益于Java虚拟机(JVM)。JVM为每个平台提供了不同的实现,使得字节码能在不同操作系统上执行。 2. **Java...
Java源代码被编译成字节码(`.class`文件),这些字节码由Java虚拟机(JVM)执行。不同的操作系统上有不同的JVM实现,使得字节码能在任何支持JVM的平台上运行。 2. **Java的安全性**:Java通过类加载器、安全管理器...
- **编译源代码**:使用 `javac` 命令将 `.java` 文件编译成 `.class` 字节码文件。 - **运行程序**:使用 `java` 命令运行编译后的 `.class` 文件。 ### 二、标识符、表达式、数据类型 #### 填空题解析 1. **...
数组类型通过在基础类型前添加左中括号表示,如 int 数组为 [I,float 数组为 [F。对象类型以 L 开头,如 `Ljava/lang/String;` 表示 String 对象。 - **内部类表示**:内部类在 Smali 中通过在类名后添加 `$` 符号...
- **JVM (Java Virtual Machine)**: 负责解释执行Java字节码的虚拟机。 - **JRE (Java Runtime Environment)**: 包含JVM以及运行Java程序所需的类库。 - **实现第一个HelloWorld** - 编写Java源代码并保存为`....
4.1.2 类的加载过程:类加载器负责将类的字节码加载到JVM中,包括Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader。 **五、反射方法的使用** 5.1 通过反射运行配置文件内容:可以根据配置文件动态...
5. **编译与运行**:使用JDK的javac命令编译源代码为字节码(.class文件),然后用java命令执行。 6. **异常处理**:学习如何使用try-catch块来处理可能出现的错误和异常。 7. **导入库**:如果项目包含其他Java包...