`
xiaomogui
  • 浏览: 239248 次
  • 性别: 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 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    北航网络教育JAVA语言与面向对象程序设计单选题及答案.doc

    TextField b = new TextField("关闭") 答案:D 编译 编译Java Applet 源程序文件产生的字节码文件的扩展名为( )。 A.A. .java B. B. .class C. C. .html D. D. .exe 答案:B 编译 编译Java Application 源程序文件...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...

    JAVA复习资料

    20、 一个Java Application源程序文件名为MyJavaApplication.java,如果使用Sun公司的Java开发工具JDK编译该源程序文件并使用其虚拟机运算这个程序的字节码文件,应该顺序执行如下两个命令: javac ...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 java虚拟机中内置的安全特性 3.6 安全管理器和java api 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10...

    深入Java虚拟机

    3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...

    java面试宝典

    141、使用useBean标志初始化BEAN时如何接受初始化参数 36 142、使用JSP如何获得客户浏览器的信息? 36 143、能象调用子程序一样调用JSP吗? 36 144、当我重编译我的JSP使用的一个类后,为什么JVM继续使用我的老CLASS...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    深入java虚拟机第二版

    3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10 保护域 ...

    day021-反射和注解笔记和代码.rar

    3、Class的实例就看成是Java中我们学过的所有的数据类型在JVM中存在的一种状态(字节码对象) String.class int.class List.class int[].class 1.概念:通过一个全限定类名,获取字节码文件 2...

    深入JAVA虚拟机(第2版)

    3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 ...

    类加载与类初始化

    \quad\quad将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。 这个过程需要类加载器参与。 \...

Global site tag (gtag.js) - Google Analytics