当前位置: 首页 > news >正文

安徽茶叶学会 网站建设/二维码引流推广的平台

安徽茶叶学会 网站建设,二维码引流推广的平台,义乌建设网站,wordpress 仿搜狗百科2019独角兽企业重金招聘Python工程师标准>>> java String 之字节码解析 关于java string 的面试题有很多。。。网上的说法也有很多中。。。。 在这我解析一下string 的用法的字节码。。。。 public class C{public C(){}public C(String a){this.stra;}String str0…

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

java String 之字节码解析

关于java  string 的面试题有很多。。。网上的说法也有很多中。。。。

 在这我解析一下string 的用法的字节码。。。。

public class C{public C(){}public C(String a){this.str=a;}String str0 = "min0";	static	String str = "min";static	String str2 = "min2";final	String str3 = "minmin2";final String str4 = "min3";public void t(int b){System.out.println("min"+str2);System.out.println("t--"+str3);System.out.println(str4+str3);System.out.println(str0+str);}public static void main(String[] args) {new A().t(2);}}

   通过javap -verbose 查看一下字节码的存储信息如下

 

Compiled from "C.java"
public class C extends java.lang.ObjectSourceFile: "C.java"minor version: 0 //class文件的次版本号major version: 49//class文件的主版本号Constant pool://常量池//Method:方法 //Field:字段 //String:字符串 //Asciz:这个Asciz表示是CONSTANT_Utf8吧,因为C ONSTANT_Utf8可以是存储四种基本信息类型:文字字符串、被定义的类和接口描述、对其他类或接口的符号引用以及属性相关的字符串。 //NameAndType:变量名的类型 //Class:类 const #1 = Method       #24.#44;        //  java/lang/Object."<init>":()V //CONSTANT_Methodref_info (10)
const #2 = String       #45;    //  min0     //字符串常量池中的常量 CONSTANT_String_info (8)
const #3 = Field        #23.#46;        //  C.str0:Ljava/lang/String;//没有static修饰的字段记录字段信息
const #4 = String       #47;    //  minmin2  //字符串常量池中的常量 CONSTANT_String_info (8)
const #5 = Field        #23.#48;        //  C.str3:Ljava/lang/String;//没有static修饰的字段
const #6 = String       #49;    //  min3    //字符串常量池中的常量
const #7 = Field        #23.#50;        //  C.str4:Ljava/lang/String;//没有static修饰的字段
const #8 = Field        #23.#51;        //  C.str:Ljava/lang/String;//static修饰的字段
const #9 = Field        #52.#53;        //  java/lang/System.out:Ljava/io/PrintS
tream;
const #10 = class       #54;    //  java/lang/StringBuilder 用于记录类或接口名CONSTANT_Class_info
const #11 = Method      #10.#44;        //  java/lang/StringBuilder."<init>":()V//用于记录方法信息 CONSTANT_Methodref_infoconst #12 = String      #55;    //  min    //字符串常量池中的常量CONSTANT_String_info (8)
const #13 = Method      #10.#56;        //  java/lang/StringBuilder.append:(Ljav
a/lang/String;)Ljava/lang/StringBuilder;用于记录方法信息 CONSTANT_Methodref_info
const #14 = Field       #23.#57;        //  C.str2:Ljava/lang/String;//static修饰的字段
const #15 = Method      #10.#58;        //  java/lang/StringBuilder.toString:()L
java/lang/String;
const #16 = Method      #59.#60;        //  java/io/PrintStream.println:(Ljava/l
ang/String;)V
const #17 = String      #61;    //  t--minmin2   //字符串常量池中的常量
const #18 = String      #62;    //  min3minmin2  //字符串常量池中的常量
const #19 = class       #63;    //  A
const #20 = Method      #19.#44;        //  A."<init>":()V
const #21 = Method      #19.#64;        //  A.t:(I)V
const #22 = String      #65;    //  min2
const #23 = class       #66;    //  C
const #24 = class       #67;    //  java/lang/Object
const #25 = Asciz       str0;
const #26 = Asciz       Ljava/lang/String;;
const #27 = Asciz       str;
const #28 = Asciz       str2;
const #29 = Asciz       str3;
const #30 = Asciz       ConstantValue;
const #31 = Asciz       str4;
const #32 = Asciz       <init>;
const #33 = Asciz       ()V;
const #34 = Asciz       Code;
const #35 = Asciz       LineNumberTable;
const #36 = Asciz       (Ljava/lang/String;)V;
const #37 = Asciz       t;
const #38 = Asciz       (I)V;
const #39 = Asciz       main;
const #40 = Asciz       ([Ljava/lang/String;)V;
const #41 = Asciz       <clinit>;
const #42 = Asciz       SourceFile;
const #43 = Asciz       C.java;
const #44 = NameAndType #32:#33;//  "<init>":()V//记录方法或字段的名称(name)和描述符(descriptor)
const #45 = Asciz       min0;
const #46 = NameAndType #25:#26;//  str0:Ljava/lang/String;// CONSTANT_NameAndType_info
const #47 = Asciz       minmin2;
const #48 = NameAndType #29:#26;//  str3:Ljava/lang/String;
const #49 = Asciz       min3;
const #50 = NameAndType #31:#26;//  str4:Ljava/lang/String;
const #51 = NameAndType #27:#26;//  str:Ljava/lang/String;
const #52 = class       #68;    //  java/lang/System
const #53 = NameAndType #69:#70;//  out:Ljava/io/PrintStream;
const #54 = Asciz       java/lang/StringBuilder;
const #55 = Asciz       min;
const #56 = NameAndType #71:#72;//  append:(Ljava/lang/String;)Ljava/lang/String
Builder;
const #57 = NameAndType #28:#26;//  str2:Ljava/lang/String;
const #58 = NameAndType #73:#74;//  toString:()Ljava/lang/String;
const #59 = class       #75;    //  java/io/PrintStream
const #60 = NameAndType #76:#36;//  println:(Ljava/lang/String;)V
const #61 = Asciz       t--minmin2;
const #62 = Asciz       min3minmin2;
const #63 = Asciz       A;
const #64 = NameAndType #37:#38;//  t:(I)V
const #65 = Asciz       min2;
const #66 = Asciz       C;
const #67 = Asciz       java/lang/Object;
const #68 = Asciz       java/lang/System;
const #69 = Asciz       out;
const #70 = Asciz       Ljava/io/PrintStream;;
const #71 = Asciz       append;
const #72 = Asciz       (Ljava/lang/String;)Ljava/lang/StringBuilder;;
const #73 = Asciz       toString;
const #74 = Asciz       ()Ljava/lang/String;;
const #75 = Asciz       java/io/PrintStream;
const #76 = Asciz       println;{
java.lang.String str0;static java.lang.String str;static java.lang.String str2;final java.lang.String str3;Constant value: String minmin2
final java.lang.String str4;Constant value: String min3//如下的Locals表示方法内局部变量个数,该例中是1,有些人疑惑的是Dog()中明明没有参数啊,应该是0啊!      
//当线程调用一个方法的时候,jvm会开辟一个帧出来,这个帧包括操作栈、局部变量列表、常量池的引用      
//非static方法,在调用的时候都会给方法默认加上一个当前对象(this)类型的参数,不需要在方法中定义,      
//这个时候局部变量列表中index为0的位置保存的是this,其他索引号按变量定义顺序累加      
//static方法不依赖对象,所以不用传this      
//Args_size表示参数个数,public C();会传一个this进去,所以value是1    
public C();Code:Stack=2, Locals=1, Args_size=10:   aload_01:   invokespecial   #1; //Method java/lang/Object."<init>":()V //调用父类的构造函数4:   aload_05:   ldc     #2; //String min07:   putfield        #3; //Field str0:Ljava/lang/String;10:  aload_011:  ldc     #4; //String minmin213:  putfield        #5; //Field str3:Ljava/lang/String;16:  aload_017:  ldc     #6; //String min319:  putfield        #7; //Field str4:Ljava/lang/String;22:  returnLineNumberTable:line 6: 0line 14: 4line 17: 10line 18: 16line 8: 22//invokespecial  //调用构造方法、父类方法      
invokevirtual  //调用普通方法(非构造方法、static方法)      
invokestatic   //调用static方法    
public C(java.lang.String);Code:Stack=2, Locals=2, Args_size=20:   aload_01:   invokespecial   #1; //Method java/lang/Object."<init>":()V //调用父类构造方法4:   aload_05:   ldc     #2; //String min0 //将将常量池中的常量压入方法栈7:   putfield        #3; //Field str0:Ljava/lang/String;10:  aload_011:  ldc     #4; //String minmin213:  putfield        #5; //Field str3:Ljava/lang/String;16:  aload_017:  ldc     #6; //String min319:  putfield        #7; //Field str4:Ljava/lang/String;22:  aload_023:  pop24:  aload_125:  putstatic       #8; //Field str:Ljava/lang/String;28:  returnLineNumberTable:line 10: 0line 14: 4line 17: 10line 18: 16line 11: 22line 12: 28public void t(int);Code:Stack=3, Locals=2, Args_size=20:   getstatic       #9; //Field java/lang/System.out:Ljava/io/PrintStream;3:   new     #10; //class java/lang/StringBuilder  //在堆中分配内存,返回对象引用,压入操作数栈   6:   dup   //复制引用到stack(栈) 7:   invokespecial   #11; //Method java/lang/StringBuilder."<init>":()V //调用构造方法10:  ldc     #12; //String min //将将常量池中的常量压入栈   12:  invokevirtual   #13; //Method java/lang/StringBuilder.append:(Ljava/lang 
/String;)Ljava/lang/StringBuilder; //调用方法15:  getstatic       #14; //Field str2:Ljava/lang/String;//访问static字段18:  invokevirtual   #13; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;//调用方法21:  invokevirtual   #15; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;//调用方法24:  invokevirtual   #16; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V//调用方法27:  getstatic       #9; //Field java/lang/System.out:Ljava/io/PrintStream;//访问static字段30:  ldc     #17; //String t--minmin2 //将常量池中的常量压入栈32:  invokevirtual   #16; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V//调用方法35:  getstatic       #9; //Field java/lang/System.out:Ljava/io/PrintStream;38:  ldc     #18; //String min3minmin2  //将常量池中的常量压入栈40:  invokevirtual   #16; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V//调用方法43:  getstatic       #9; //Field java/lang/System.out:Ljava/io/PrintStream;//访问static字段46:  new     #10; //class java/lang/StringBuilder //在堆中分配内存,返回对象引用,压入操作数栈  49:  dup50:  invokespecial   #11; //Method java/lang/StringBuilder."<init>":()V//调用方法53:  aload_054:  getfield        #3; //Field str0:Ljava/lang/String;//访问str0字段57:  invokevirtual   #13; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;//调用方法60:  getstatic       #8; //Field str:Ljava/lang/String;63:  invokevirtual   #13; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder; //调用方法66:  invokevirtual   #15; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String; //调用方法69:  invokevirtual   #16; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V //调用方法72:  returnLineNumberTable:line 20: 0line 21: 27line 22: 35line 23: 43line 24: 72public static void main(java.lang.String[]);Code:Stack=2, Locals=1, Args_size=10:   new     #19; //class A3:   dup4:   invokespecial   #20; //Method A."<init>":()V7:   iconst_28:   invokevirtual   #21; //Method A.t:(I)V11:  returnLineNumberTable:line 26: 0line 28: 11static {};Code:Stack=1, Locals=0, Args_size=00:   ldc     #12; //String min2:   putstatic       #8; //Field str:Ljava/lang/String;5:   ldc     #22; //String min27:   putstatic       #14; //Field str2:Ljava/lang/String;10:  returnLineNumberTable:line 15: 0line 16: 5}

  通过字节码信息我们可以发现

system.out.print("min"+str2);Stringbuilder.append(String).append(I)toString;常量池一个对象2个对象

0:   getstatic       #9; //Field java/lang/System.out:Ljava/io/PrintStream;3:   new     #10; //class java/lang/StringBuilder//StringBuilder对象6:   dup7:   invokespecial   #11; //Method java/lang/StringBuilder."<init>":()V10:  ldc     #12; //String min12:  invokevirtual   #13; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;15:  getstatic       #14; //Field str2:Ljava/lang/String;18:  invokevirtual   #13; //Method java/lang/StringBuilder.append:(Ljava/lang
/String;)Ljava/lang/StringBuilder;21:  invokevirtual   #15; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;//调用stringbuilder.toString()方法。产生对象24:  invokevirtual   #16; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V

 System.out.println(str0+str);

字符串拼接。。。。结果同上

 

 

System.out.println("t--"+str3);

由于str3是final修饰的在编译期间就在常量池中了 t--minmin2

const #17 = String      #61;    //  t--minmin2

 

System.out.println(str4+str3);

由于str4.str3都是final编译常量所以同上

const #62 = Asciz       min3minmin2;

 

 

 

 System.out.println(“你好”+“吗”);

由于编译期间(“你好”+“吗”);已经在String常量池中了。同上

const #19 = String      #64;    //  你好吗

 

 

由于时间问题。写的比较毛糙。先写到这了。。下午还要上班。。先小睡会。。。。。下次在写

 

转载于:https://my.oschina.net/xiaominmin/blog/1598271

http://www.lbrq.cn/news/1349839.html

相关文章:

  • 网站怎样做域名绑定/百度移动点击排名软件
  • 做门户网站用什么技术好/seo网站推广主要目的不包括
  • 做平行进口的汽车网站/360营销推广
  • 哈尔滨的网站建设公司哪家好/品牌营销的概念
  • 网站怎么做必须交钱吗/网站运营怎么做
  • 昆明企业建站模板/淘宝推广方法有哪些
  • 网络营销推广网站收录哪些/韶山百度seo
  • php 企业网站 后台图片上传/百度我的订单
  • python可以做网站/查域名
  • 网站红色搭配/seo软件简单易排名稳定
  • 微信昵称大全/指定关键词seo报价
  • 网站制作过程简介/超级外链在线发布
  • 网站解析后几天可以访问/自媒体有哪些平台
  • 做问卷调查有哪些网站好/交换友情链接的渠道
  • 网站建设军成/1688官网
  • Dreamweaver上网站怎么做/湖南网络营销外包
  • 武汉网站建设哪家最好/5188关键词挖掘
  • 为什么找别人做网站/太原seo哪家好
  • 如何建立公司网站是什么/客户关系管理
  • 手机做炫光图头像的网站/优化大师电脑版官方免费下载
  • appserv做网站教程/培训心得体会300字
  • 做企业网站不好混/广州中小企业seo推广运营
  • 阳春市住房规划建设局网站/提高网站排名软件
  • 自己可以做网站空间吗/企业网站的作用
  • 国家图书馆网站建设介绍/哪些行业适合做网络推广
  • 哪个浏览器不屏蔽网站/优化一下
  • 做网做网站建设/app线上推广是什么工作
  • 深圳做网站和视频宣传机构/网站制作软件
  • 政府网站集群建设/企业营销策略分析论文
  • 专业推广公司哪家好/域名seo查询
  • 【插件式微服务架构系统分享】之 解耦至上:gateway 网关与APISIX 网关的不同分工
  • 美图复现|Science:添加显著性的GO富集分析美图
  • 使用Puppeteer轻松自动化浏览器操作
  • Linux驱动24 --- RkMedia 视频 API 使用
  • 工业级 CAN 与以太网桥梁:串口服务器CAN通讯转换器深度解析(下)
  • Dot1x认证原理详解