---- 待完善............................
1. java代码
public class Test2 {
public void testString() {
String a = "hello";
String b = "word";
String c = a + b;
System.out.println(c);
}
public void testString2() {
String c = "";
for(int i=0;i<10;i++) {
c = c+i;
}
System.out.println(c);
}
public void testStringBuffer() {
String a = "hello";
String b = "word";
StringBuffer c = new StringBuffer("");
c.append(a).append(b);
System.out.println(c);
}
public void testStringBuffer2() {
StringBuffer c = new StringBuffer("");
for(int i=0;i<10;i++) {
c = c.append(i);
}
System.out.println(c);
}
}
2. 字节码
Compiled from "Test2.java"
public class com.java.test.Test2 extends java.lang.Object{
public com.java.test.Test2();
Code:
0: aload_0
-- 将第一个引用类型本地变量推送至栈顶
1: invokespecial #9; //Method java/lang/Object."<init>":()V
-- 调用超类构造方法,实例初始化方法,私有方法
4: return
-- 从当前方法返回void
public void testString();
Code:
0: ldc #16; //String hello
-- 将int, float或String型常量值从常量池中推送至栈顶
2: astore_1
-- 将栈顶引用型数值存入第二个本地变量
3: ldc #18; //String word
5: astore_2
6: new #20; //class java/lang/StringBuilder
-- 创建一个新的对象,并将其引用值压入栈顶。 #20是常量池索引(本类其它和String有关的new这个值都是一样的)。
-- 表示常量池中第20个索引的值。class java/lang/StringBuilder,该指令占用3个字节。
9: dup
-- 复制栈顶数值并将复制值压入栈顶
--JVM新创建一个对象后,首先需要调用<init>实例初始化方法,
--初始化完成后再会做保存到局部变量或调用方法的处理(类似代码:Object obj = new Object();),
--这样就需要在操作数栈上保留两个相同的对象引用,所以需要dup。
10: aload_1
-- 将第二个引用类型本地变量推送至栈顶
11: invokestatic #26; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
-- 调用静态方法 String.valueOf
14: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
-- 调用超类构造方法,实例初始化方法,私有方法 调用StringBuilder的init方法
17: aload_2
-- 将第三个引用类型本地变量推送至栈顶
18: invokevirtual #33; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
-- 调用实例方法,调用StringBuilder.append
21: invokevirtual #37; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
-- 调用实例方法,调用StringBuilder.toString
24: astore_3
-- 将栈顶引用型 数值存入第四个本地变量
25: getstatic #43; //Field java/lang/System.out:Ljava/io/PrintStream;
-- 获取指定类的静态域,并将其值压入栈顶
28: aload_3
-- 将第四个引用类型本地变量推送至栈顶
29: invokevirtual #48; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
-- 调用实例方法 println PrintStream.println
32: return
public void testString2();
Code:
0: ldc #55; //String
-- 将int, float或String型常量值从常量池中推送至栈顶
2: astore_1
3: iconst_0
4: istore_2
5: goto 30
-- 无条件跳转 即跳转到 30: iload_2 这里
8: new #20; //class java/lang/StringBuilder
11: dup
12: aload_1
13: invokestatic #26; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
16: invokespecial #29; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
19: iload_2
20: invokevirtual #58; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
23: invokevirtual #37; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
26: astore_1
27: iinc 2, 1
--将指定int型变量增加指定值(i++, i--, i+=2)
30: iload_2
--将第三个int型本地变量推送至栈顶
31: bipush 10
--将单字节的常量值(-128~127)推送至栈顶
33: if_icmplt 8
--比较栈顶两int型数值大小,当结果小于0时跳转
36: getstatic #43; //Field java/lang/System.out:Ljava/io/PrintStream;
39: aload_1
40: invokevirtual #48; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
43: return
public void testStringBuffer();
Code:
0: ldc #16; //String hello
2: astore_1
3: ldc #18; //String word
5: astore_2
6: new #63; //class java/lang/StringBuffer
9: dup
10: ldc #55; //String
12: invokespecial #64; //Method java/lang/StringBuffer."<init>":(Ljava/lang/String;)V
15: astore_3
16: aload_3
17: aload_1
18: invokevirtual #67; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
21: aload_2
22: invokevirtual #67; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
25: pop
--将栈顶数值弹出 (数值不能是long或double类型的)
26: getstatic #43; //Field java/lang/System.out:Ljava/io/PrintStream;
29: aload_3
30: invokevirtual #70; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
33: return
public void testStringBuffer2();
Code:
0: new #63; //class java/lang/StringBuffer
3: dup
4: ldc #55; //String
6: invokespecial #64; //Method java/lang/StringBuffer."<init>":(Ljava/lang/String;)V
9: astore_1
10: iconst_0
11: istore_2
12: goto 24
15: aload_1
16: iload_2
17: invokevirtual #75; //Method java/lang/StringBuffer.append:(I)Ljava/lang/StringBuffer;
20: astore_1
21: iinc 2, 1
-- iinc index ,const
-- The index is an unsigned byte that must be an index into the local variable array of
-- the current frame . The const is an immediate signed byte. The local variable
-- at index must contain an int. The value const is first sign-extended to an int, and
-- then the local variable at index is incremented by that amount.
24: iload_2
25: bipush 10
27: if_icmplt 15
30: getstatic #43; //Field java/lang/System.out:Ljava/io/PrintStream;
33: aload_1
34: invokevirtual #70; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
37: return
}
分享到:
相关推荐
### Java字节码揭秘 #### 一、Java体系结构概览 Java体系结构主要由以下几个部分构成: 1. **Java Language(Java语言)**: 定义了语法和语义规则,用于编写Java程序。 2. **Java Class(Java类)**: 是Java程序...
### Java习题:字节码文件相关知识点 #### 一、选择题解析 ...以上解析涵盖了给定的Java习题中涉及的主要知识点,包括字节码文件、Java Applet的编写、变量的初始化、标识符规则以及`switch`语句的使用等方面。
### 探索Java虚拟机的心脏:字节码执行全解析 #### Java语言概览 Java自1995年由Sun Microsystems(现归Oracle所有)发布以来,已成为全球范围内广泛应用的编程语言。作为一种面向对象的语言,Java将现实世界中的...
字节码指令如`new`, `dup`, `invokespecial`和`putfield`等用于创建并初始化这个内部类实例。 在Java 7及之前版本,为了实现类似的功能,我们需要创建一个显式的内部类,就像示例代码中`InnerClass`类内的`f`字段...
JVM是Java的核心,它是解释和执行字节码的平台,实现了Java的跨平台特性。JVM屏蔽了底层操作系统和硬件的差异,使得Java程序可以在任何支持JVM的平台上运行。 学习Java基础时,首先会接触到“Hello, World!”程序,...
编译后的字节码文件可以在任何支持Java的平台上运行,这体现了Java“一次编写,到处运行”的特性。 - **java命令**:用于运行编译后的`.class`文件。在运行之前,必须确保`.class`文件中有主类并且该类中包含`public...
1. **字节码与 JVM**:Java 程序被编译成字节码,而不是直接编译成本地机器代码。字节码是一种中间语言,由 JVM 解释执行,这样就实现了真正的“一次编写,到处运行”。 2. **不同平台上的 JVM 实现**:不同的操作...
- `javac`:Java编译器,用于将Java源代码(.java文件)编译成字节码文件(.class文件)。 - `java`:Java解释器/虚拟机,负责执行字节码文件。 - `jdb`:Java调试器,提供交互式的调试环境。 - `javap`:Java反...
1. **字节码文件扩展名**:Java源代码(.java文件)经过编译后生成的是字节码文件(.class文件),这个过程由Java编译器完成。 2. **main方法**:Java Application程序的执行始于`main`方法,其标准定义为`public ...
- **java命令**:负责启动JVM并运行字节码文件,其中包含主函数`public static void main(String[] args)`作为程序的入口点。 #### 二、Java语法基础 - **关键字与保留字**: - **关键字**:Java语言中具有特殊...
- **javac**:Java编译器,用于将Java源代码编译成字节码。 - **java**:Java解释器,用于执行字节码。 - **jdb**:Java调试器,提供调试功能。 - **javap**:Java反汇编器,用于查看字节码文件的内部结构。 ### 3....
- **验证**:JVM对加载的字节码进行验证,确保字节码符合Java语言规范和安全要求。这一步非常重要,因为它保证了字节码的安全性和正确性。 - **准备**:JVM为类的静态变量分配内存空间,并设置默认初始值。 - **...
- **JVM (Java Virtual Machine)**:Java虚拟机,它是运行在操作系统之上的一层抽象计算机,负责执行Java字节码。 #### 二、第一个Java程序 - HelloWorld! 创建并运行一个简单的Java程序通常包括以下步骤: 1. ...
9. **开发与运行Java程序的过程**:这包括编写源代码、使用`javac`编译源代码成字节码、使用`java`执行字节码,如果是Web应用,还需要在Web服务器上部署并使用浏览器加载。 10. **Java程序组成**:Java程序由类...
- **JRE (Java Runtime Environment)**:包含了Java程序运行所需的类库和JVM(Java Virtual Machine),后者是执行Java字节码的关键组件。 为了确保Java程序能够在不同的操作系统上运行,需要正确配置环境变量: 1...
- 跨平台性:Java程序编译成字节码(.class文件),可以在任何支持Java虚拟机(JVM)的操作系统上运行。 - 解释性:Java程序在运行时需要经过JVM解释执行,而非直接被操作系统执行。 - **Java环境搭建** - JDK(Java...
20. **JVM**:简要了解Java虚拟机的工作原理,包括类加载、字节码执行和内存模型。 这份笔记不仅适合初学者,也对有经验的开发者巩固基础非常有帮助。通过学习这些内容,你可以建立起坚实的Java编程基础,为进一步...
10. **JVM(Java Virtual Machine)**:Java程序的运行平台,负责字节码的解释执行。 通过北大青鸟的这套Java基础课件,学习者可以系统地学习这些概念,并通过实例练习加深理解,为后续深入学习Java编程打下坚实的...
### Java常用类与基础API-String的理解与不可变性 #### 一、字符串相关类之不可变字符序列:String ##### (1) 对String类的理解(以JDK8为例说明) **1. 环境** 本文档使用JDK 8进行演示。JDK 8的环境设置确保了...