`
xiaomogui
  • 浏览: 242672 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java基础之string字节码初始

阅读更多

---- 待完善............................

 

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体系结构概览 Java体系结构主要由以下几个部分构成: 1. **Java Language(Java语言)**: 定义了语法和语义规则,用于编写Java程序。 2. **Java Class(Java类)**: 是Java程序...

    java习题 字节码文件

    ### Java习题:字节码文件相关知识点 #### 一、选择题解析 ...以上解析涵盖了给定的Java习题中涉及的主要知识点,包括字节码文件、Java Applet的编写、变量的初始化、标识符规则以及`switch`语句的使用等方面。

    探索Java虚拟机的心脏:字节码执行全解析

    ### 探索Java虚拟机的心脏:字节码执行全解析 #### Java语言概览 Java自1995年由Sun Microsystems(现归Oracle所有)发布以来,已成为全球范围内广泛应用的编程语言。作为一种面向对象的语言,Java将现实世界中的...

    Java lambda表达式和JVM字节码功能详解.pdf

    字节码指令如`new`, `dup`, `invokespecial`和`putfield`等用于创建并初始化这个内部类实例。 在Java 7及之前版本,为了实现类似的功能,我们需要创建一个显式的内部类,就像示例代码中`InnerClass`类内的`f`字段...

    java基础.pdf

    JVM是Java的核心,它是解释和执行字节码的平台,实现了Java的跨平台特性。JVM屏蔽了底层操作系统和硬件的差异,使得Java程序可以在任何支持JVM的平台上运行。 学习Java基础时,首先会接触到“Hello, World!”程序,...

    java基础知识总结(经典)

    编译后的字节码文件可以在任何支持Java的平台上运行,这体现了Java“一次编写,到处运行”的特性。 - **java命令**:用于运行编译后的`.class`文件。在运行之前,必须确保`.class`文件中有主类并且该类中包含`public...

    java基础让你不会到入门的笔记

    1. **字节码与 JVM**:Java 程序被编译成字节码,而不是直接编译成本地机器代码。字节码是一种中间语言,由 JVM 解释执行,这样就实现了真正的“一次编写,到处运行”。 2. **不同平台上的 JVM 实现**:不同的操作...

    Java语言程序设计基础教程

    - `javac`:Java编译器,用于将Java源代码(.java文件)编译成字节码文件(.class文件)。 - `java`:Java解释器/虚拟机,负责执行字节码文件。 - `jdb`:Java调试器,提供交互式的调试环境。 - `javap`:Java反...

    java基础试题综合试题

    1. **字节码文件扩展名**:Java源代码(.java文件)经过编译后生成的是字节码文件(.class文件),这个过程由Java编译器完成。 2. **main方法**:Java Application程序的执行始于`main`方法,其标准定义为`public ...

    Java 基础知识总结(超级经典)

    - **java命令**:负责启动JVM并运行字节码文件,其中包含主函数`public static void main(String[] args)`作为程序的入口点。 #### 二、Java语法基础 - **关键字与保留字**: - **关键字**:Java语言中具有特殊...

    《Java语言程序设计基础教程》习题解答

    - **javac**:Java编译器,用于将Java源代码编译成字节码。 - **java**:Java解释器,用于执行字节码。 - **jdb**:Java调试器,提供调试功能。 - **javap**:Java反汇编器,用于查看字节码文件的内部结构。 ### 3....

    Java零基础 - Java的加载与执行原理剖析.md

    - **验证**:JVM对加载的字节码进行验证,确保字节码符合Java语言规范和安全要求。这一步非常重要,因为它保证了字节码的安全性和正确性。 - **准备**:JVM为类的静态变量分配内存空间,并设置默认初始值。 - **...

    Java基础语法.docx

    - **JVM (Java Virtual Machine)**:Java虚拟机,它是运行在操作系统之上的一层抽象计算机,负责执行Java字节码。 #### 二、第一个Java程序 - HelloWorld! 创建并运行一个简单的Java程序通常包括以下步骤: 1. ...

    Java语言程序设计基础教程习题解答.doc

    9. **开发与运行Java程序的过程**:这包括编写源代码、使用`javac`编译源代码成字节码、使用`java`执行字节码,如果是Web应用,还需要在Web服务器上部署并使用浏览器加载。 10. **Java程序组成**:Java程序由类...

    java基础总结

    - **JRE (Java Runtime Environment)**:包含了Java程序运行所需的类库和JVM(Java Virtual Machine),后者是执行Java字节码的关键组件。 为了确保Java程序能够在不同的操作系统上运行,需要正确配置环境变量: 1...

    Java基础(韩顺平版)笔记详

    - 跨平台性:Java程序编译成字节码(.class文件),可以在任何支持Java虚拟机(JVM)的操作系统上运行。 - 解释性:Java程序在运行时需要经过JVM解释执行,而非直接被操作系统执行。 - **Java环境搭建** - JDK(Java...

    Java基础知识笔记.rar

    20. **JVM**:简要了解Java虚拟机的工作原理,包括类加载、字节码执行和内存模型。 这份笔记不仅适合初学者,也对有经验的开发者巩固基础非常有帮助。通过学习这些内容,你可以建立起坚实的Java编程基础,为进一步...

    北大青鸟Java基础课件

    10. **JVM(Java Virtual Machine)**:Java程序的运行平台,负责字节码的解释执行。 通过北大青鸟的这套Java基础课件,学习者可以系统地学习这些概念,并通过实例练习加深理解,为后续深入学习Java编程打下坚实的...

    Java常用类与基础API-String的理解与不可变性

    ### Java常用类与基础API-String的理解与不可变性 #### 一、字符串相关类之不可变字符序列:String ##### (1) 对String类的理解(以JDK8为例说明) **1. 环境** 本文档使用JDK 8进行演示。JDK 8的环境设置确保了...

Global site tag (gtag.js) - Google Analytics