免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文将对Java字节码进行解析,以及一些效率问题。AD: 一:Java字节代码的组织形式类文件OxCAFEBABE,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组,方法个数,方法信息数组,属性个数,属性信息数组二:查看方法 - javap命令例子:有一个Java类Demo.java1. publicclassDemo2. privateStringstr1;3. privateStringstr2;4. privateintnum1;5. privateintnum2;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文件的字节码信息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;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=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/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. 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=AscizsayHello2;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. Constantvalue: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. Code: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. StartLengthSlotNameSignature82. 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,如果类中没有显式声明构造函数的话,编译器会插入一个缺省无参的构造函数(构造函数在JVM级别是显示成的普通函数)。三:检测代码的效率问题学习Java的过程中,都会了解到字符串合并时要用到StringBuffer 来代替String,那下面就来通过Java字节码来验证两种方式的效率性。例子:一个Java类 TestString.java1. publicclassTestString2. publicStringtestString(Stringstr1,Stringstr2)3. returnstr1+str2;4. 5. publicStringtestStringBuffer(StringBuffersb,Stringstr)6. returnsb.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,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;/Methodjava/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_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 方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年濮阳辅警招聘考试题库附答案详解ab卷
- 2025年温州辅警协警招聘考试真题附答案详解(研优卷)
- 2025年铜川辅警协警招聘考试备考题库附答案详解(典型题)
- 2025年连江县辅警协警招聘考试备考题库及答案详解(必刷)
- 2025年黑龙江辅警招聘考试真题附答案详解(模拟题)
- 2025年湛江辅警协警招聘考试真题含答案详解(培优)
- 2025年遵义辅警协警招聘考试真题及答案详解(历年真题)
- 2025年璧山县辅警招聘考试真题及答案详解(易错题)
- 2025年葫芦岛辅警协警招聘考试备考题库及1套参考答案详解
- 2025年阿里辅警招聘考试题库附答案详解(培优)
- DL-T5054-2016火力发电厂汽水管道设计规范
- 二年级数学《乘加乘减》集体备课活动记录
- 2024年广东省政工师理论知识考试参考题库(含答案)
- 急性根尖周炎临床表现讲解
- 预防校园欺凌:我们与恶的距离
- 高速铁路客运服务职业生涯规划
- 列车电子防滑器-电子防滑器原理
- 西方交响乐-完整版课件
- 计算机网络基础与应用-网络管理与维护
- LED显示屏系统安装与调试方案
- 钣金加工过程作业指导书
评论
0/150
提交评论