2021-2022年收藏的精品资料软件工程师Java字节码开发深入解析教程解释.docx

上传人:知****量 文档编号:18905552 上传时间:2022-06-03 格式:DOCX 页数:6 大小:35KB
返回 下载 相关 举报
2021-2022年收藏的精品资料软件工程师Java字节码开发深入解析教程解释.docx_第1页
第1页 / 共6页
2021-2022年收藏的精品资料软件工程师Java字节码开发深入解析教程解释.docx_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《2021-2022年收藏的精品资料软件工程师Java字节码开发深入解析教程解释.docx》由会员分享,可在线阅读,更多相关《2021-2022年收藏的精品资料软件工程师Java字节码开发深入解析教程解释.docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、星期八职场经验网()【现成经验助你快速完成工作】本文将对Java字节码进行解析,以及一些效率问题。AD: 一:Java字节代码的组织形式类文件OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组,方法个数,方法信息数组,属性个数,属性信息数组二:查看方法 - javap命令例子:有一个Java类Demo.java1. publicclassDemo2. privateStringstr1;3. privateStringstr2;4. privateintnum1;5. privateint

2、num2;6. publicstaticfinalStringSTATIC_DATA=helloworld;7. 8. privatevoidsayHello1()9. System.out.println(thisismethod1.);10. 11. privatevoidsayHello2()12. System.out.println(thisismethod2.);13. 14. publicvoidsayHello3()15. System.out.println(thisismethod3.);16. 17. 通过jdk自带的反编译工具命令 javap 可以查看class文件的字

3、节码信息D:javap -verbose Demo Demo.txtDemo.txt:1. CompiledfromDemo.java2. publicclassDemoextendsjava.lang.Object3. SourceFile:Demo.java4. minorversion:05. majorversion:496. 7. Constantpool:8. const#1=class#2;/Demo9. const#2=AscizDemo;10. const#3=class#4;/java/lang/Object11. const#4=Ascizjava/lang/Object

4、;12. const#5=Ascizstr1;13. const#6=AscizLjava/lang/String;14. const#7=Ascizstr2;15. const#8=Asciznum1;16. const#9=AscizI;17. const#10=Asciznum2;18. const#11=AscizSTATIC_DATA;19. const#12=AscizConstantValue;20. const#13=String#14;/helloworld21. const#14=Ascizhelloworld;22. const#15=Asciz;23. const#16

5、=Asciz()V;24. const#17=AscizCode;25. const#18=Method#3.#19;/java/lang/Object.:()V26. const#19=NameAndType#15:#16;/:()V27. const#20=AscizLineNumberTable;28. const#21=AscizLocalVariableTable;29. const#22=Ascizthis;30. const#23=AscizLDemo;31. const#24=AscizsayHello1;32. const#25=Field#26.#28;/java/lang

6、/System.out:Ljava/io/PrintStream;33. const#26=class#27;/java/lang/System34. const#27=Ascizjava/lang/System;35. const#28=NameAndType#29:#30;/out:Ljava/io/PrintStream;36. const#29=Ascizout;37. const#30=AscizLjava/io/PrintStream;38. const#31=String#32;/thisismethod1.39. const#32=Ascizthisismethod1.;40.

7、 const#33=Method#34.#36;/java/io/PrintStream.println:(Ljava/lang/String;)V41. const#34=class#35;/java/io/PrintStream42. const#35=Ascizjava/io/PrintStream;43. const#36=NameAndType#37:#38;/println:(Ljava/lang/String;)V44. const#37=Ascizprintln;45. const#38=Asciz(Ljava/lang/String;)V;46. const#39=Asciz

8、sayHello2;47. const#40=String#41;/thisismethod2.48. const#41=Ascizthisismethod2.;49. const#42=AscizsayHello3;50. const#43=String#44;/thisismethod3.51. const#44=Ascizthisismethod3.;52. const#45=AscizSourceFile;53. const#46=AscizDemo.java;54. 55. 56. publicstaticfinaljava.lang.StringSTATIC_DATA;57. Co

9、nstantvalue:Stringhelloworld58. publicDemo();59. Code:60. Stack=1,Locals=1,Args_size=161. 0:aload_062. 1:invokespecial#18;/Methodjava/lang/Object.:()V63. 4:return64. LineNumberTable:65. line2:066. LocalVariableTable:67. StartLengthSlotNameSignature68. 050thisLDemo;69. 70. publicvoidsayHello3();71. C

10、ode:72. Stack=2,Locals=1,Args_size=173. 0:getstatic#25;/Fieldjava/lang/System.out:Ljava/io/PrintStream;74. 3:ldc#43;/Stringthisismethod3.75. 5:invokevirtual#33;/Methodjava/io/PrintStream.println:(Ljava/lang/String;)V76. 8:return77. LineNumberTable:78. line17:079. line18:880. LocalVariableTable:81. S

11、tartLengthSlotNameSignature82. 090thisLDemo;83. 解析:1.版本号 major version: 49 /java版本 jdk1.6显示的是50, jdk1.5显示的是49,jdk1.4显示的是58 , 高版本能执行低版本的class文件2.常量池Constant poolMethod:方法Field:字段String:字符串Asciz:签名如由jvm调用,其他是不能够去调用它的NameAndType:变量名的类型Class:类通过字节码,我们可以看到Demo类 继承于java.lang.Object,如果类中没有显式声明构造函数的话,编译器会插入

12、一个缺省无参的构造函数(构造函数在JVM级别是显示成的普通函数)。三:检测代码的效率问题学习Java的过程中,都会了解到字符串合并时要用到StringBuffer 来代替String,那下面就来通过Java字节码来验证两种方式的效率性。例子:一个Java类 TestString.java1. publicclassTestString2. publicStringtestString(Stringstr1,Stringstr2)3. returnstr1+str2;4. 5. publicStringtestStringBuffer(StringBuffersb,Stringstr)6. re

13、turnsb.append(str).toString();7. 8. 9. javap c TestString 后字节码信息:1. CompiledfromTestString.java2. publicclassTestStringextendsjava.lang.Object3. publicTestString();4. Code:5. 0:aload_06. 1:invokespecial#8;/Methodjava/lang/Object.:()V7. 4:return8. 9. publicjava.lang.StringtestString(java.lang.String,

14、java.lang.String);10. Code:11. 0:new#16;/classjava/lang/StringBuilder12. 3:dup13. 4:aload_114. 5:invokestatic#18;/Methodjava/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;15. 8:invokespecial#24;/Methodjava/lang/StringBuilder.:(Ljava/lang/String;)V16. 11:aload_217. 12:invokevirtual#27;/Me

15、thodjava/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;18. 15:invokevirtual#31;/Methodjava/lang/StringBuilder.toString:()Ljava/lang/String;19. 18:areturn20. 21. publicjava.lang.StringtestStringBuffer(java.lang.StringBuffer,java.lang.String);22. Code:23. 0:aload_124. 1:aload_

16、225. 2:invokevirtual#40;/Methodjava/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;26. 5:invokevirtual#45;/Methodjava/lang/StringBuffer.toString:()Ljava/lang/String;27. 8:areturn28. 从上面编译后的字节码信息可以看出来,方法testString 调用了五个方法:new 、invokestatic 、invokespecial 和两个invokevirtual ; 而testStringBuffer 方法只调用了两个invokevirtual 方法。第一个方法比第二个方法多做了好多工作,其效率当然是要低的。而且我们从java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;可以看出来其实对于String字符串合并,内部还是转化为StringBuilder的方法调用,这是因为String是长度不可变的,所以不如直接采用StringBuilder(与StringBuffer 长度都是可变的,只不过前者是非线程安全,后者是线程安全)进行字符串合并。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作计划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁