java中p_javap的基本用法
javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
语法:
javap[ 命令选项 ] class. . .
javap命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap将输出传递给它的类的 public 域及方法。javap将其输出到标准输出设备上。
命令选项
-help 输出javap的帮助信息。
-l 输出行及局部变量表。
-b 确保与 JDK 1.1javap的向后兼容性。
-public 只显示 public 类及成员。
-protected 只显示 protected 和 public 类及成员。
-package 只显示包、protected 和 public 类及成员。这是缺省设置。
-private 显示所有类和成员。
-J[flag] 直接将 flag 传给运行时系统。
-s 输出内部类型签名。
-c 输出类中各方法的未解析的代码,即构成Java字节码的指令。
-verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
-classpath[路径] 指定javap用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
-bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心Java平台的类,位于 jrelib下面。
-extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。
英文说明:
C:\>javap -help Usage: javap ...
where options include: -c Disassemble the code -classpath Specify where to find user class files -extdirs Override location of installed extensions -help Print this usage message -J Pass directly to the runtime system -l Print line number and local variable tables -public Show only public classes and members -protected Show protected/public classes and members -package Show package/protected/public classes and members (default) -private Show all classes and members -s Print internal type signatures -bootclasspath Override location of class files loaded by the bootstrap class loader -verbose Print stack size, number of locals and args for methods If verifying, print reasons for failure
示例:
下面也经典的StringBuilder代替String做字符串的例子。
public class JAVAPTest {
public static void main(String[] args) {
}
public static String contactWithStringNoLoopNoPara() {
String s = "This is " + " my " + "first JAVAP test code.";
return s;
}
public static String contactWithStringNoLoop(int count) {
String s = "This is " + " my " + count + "th JAVAP test code.";
return s;
}
public static String contactWithStringLoop(int count) {
String s = "";
for (int i = 0; i
s += i;
}
return s;
}
public static String contactWithStringBufferLoop(int count) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i
sb.append(i);
}
return sb.toString();
}
}
先编译:javac JAVAPTest.java
执行反编译:javap -c JAVAPTest //注意这个地方不需要class后缀。
结果如下:
Compiled from "JAVAPTest.java"
public class JAVAPTest extends java.lang.Object{
public JAVAPTest();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: return
public static java.lang.String contactWithStringNoLoopNoPara();
Code:
0: ldc #2; //String This is my first JAVAP test code.
2: astore_0
3: aload_0
4: areturn
public static java.lang.String contactWithStringNoLoop(int);
Code:
0: new #3; //class java/lang/StringBuilder
3: dup
4: invokespecial #4; //Method java/lang/StringBuilder."":()V
7: ldc #5; //String This is my
9: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
12: iload_0
13: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
16: ldc #8; //String th JAVAP test code.
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_1
25: aload_1
26: areturn
public static java.lang.String contactWithStringLoop(int);
Code:
0: ldc #10; //String
2: astore_1
3: iconst_0
4: istore_2
5: iload_2
6: iload_0
7: if_icmpge 35
10: new #3; //class java/lang/StringBuilder
13: dup
14: invokespecial #4; //Method java/lang/StringBuilder."":()V
17: aload_1
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: iload_2
22: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
25: invokevirtual #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
28: astore_1
29: iinc 2, 1
32: goto 5
35: aload_1
36: areturn
public static java.lang.String contactWithStringBufferLoop(int);
Code:
0: new #11; //class java/lang/StringBuffer
3: dup
4: invokespecial #12; //Method java/lang/StringBuffer."":()V
7: astore_1
8: iconst_0
9: istore_2
10: iload_2
11: iload_0
12: if_icmpge 27
15: aload_1
16: iload_2
17: invokevirtual #13; //Method java/lang/StringBuffer.append:(I)Ljava/lang/StringBuffer;
20: pop
21: iinc 2, 1
24: goto 10
27: aload_1
28: invokevirtual #14; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
31: areturn
}
有这个结果我们可以知道。
1。contactWithStringNoLoopNoPara方法中,代码里面是字符串拼接,貌似需要是用StringBuilder替换的好。其实在看了上面的反编译结果后,已经自动组合成一个固定字符串了。因此完全没有必要使用StringBuilder。
0: ldc #2; //String This is my first JAVAP test code.
2。contactWithStringNoLoop方法中,因为使用到了变量,貌似需要是用StringBuilder替换的好。其实在看了上面的反编译结果后,已经自动使用了StringBuilder。所以代码也没有必要使用StringBuilder。
3. contactWithStringLoop方法中,是循环拼接字符串,貌似需要是用StringBuilder替换的好。看了反编译后,每个循环里面都各自生成了一个StringBuilder,并将StringBuilder.toString()防赋值给我们的Sring变量。而我们希望的是只生成一个StringBuilder对象。因此改为StringBuilder的好。循环的时候改为contactWithBufferLoop的方法最好。
4.contactWithBufferLoop方法中,是循环拼接字符串。也是我们预想的步骤在执行。
java中p_javap的基本用法相关推荐
- Java中Date各种相关用法
Java中Date各种相关用法 本文主要介绍Java中Date各种相关用法. AD: Java中Date各种相关用法(一) 1.计算某一月份的最大天数 Java代码 Calendar time=C ...
- java中arraycopy的用法_[jdk源码阅读系列]Java中System.arraycopy()的用法
本文转载,原文链接: 3分钟了解Java中System.arraycopy的用法 - 伊万夫斯基 - 博客园 https://www.cnblogs.com/benjieqiang/p/114288 ...
- Java中split函数的用法及使用示例
Java中split函数的用法及使用示例 2010-05-04 10:21 日志原文:http://lhgc.blog.sohu.com/80444801.html java.lang.string. ...
- JAVA中 BufferedImage、ImageIO用法
转载:JAVA中BufferedImage.ImageIO用法 - 邓维-java - 博客园 (cnblogs.com) BufferedImage BufferedImage是其 ...
- java中compare语句的用法,compare的用法_java中 compareTo()的程序代码及用法
compare的用法与区别? 一.用法 v. (动词) 1.compare的基本意思是"比较,对照",主要用于比较事物的典型特征及其价值,而不在于比较相同与不同. 2.compar ...
- java中next()和nextline()用法区别(详细说明)
java中next和nextline用法区别 一,方法说明 二,空格的情况(tab键相当于多个空个 1.测试代码 2.中间出现空格时 3.开头出现空格时 三,回车键的情况 分析:回车键的情况 四,常见 ...
- Java中Steam流的用法及使用备忘
文章目录 Java中Steam流的用法及使用备忘 一. 流的常用创建方法 1-1 使用Collection下的 stream() 和 parallelStream() 方法 1-2 使用Arrays ...
- java中iterator用法_java_详解Java中Iterator迭代器的用法,迭代器(Iterator)迭代 - phpStudy...
详解Java中Iterator迭代器的用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为&quo ...
- JAVA中split函数的用法
JAVA中split函数的用法 只写经常使用的,并不完整. 1.基本用法,将字符串按照指定字符串进行分割,例如: public class Main {public static void main( ...
最新文章
- mysql 授权与回收权限_MySQL 操作命令梳理(4)-- grant授权和revoke回收权限
- 有关上次的字符串是否相等的比较
- [转] Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7
- Atitit 建立新组织集团模型的框架基本制度与一些原则
- Ubuntu18.04-albert编译安装记录
- GitHub使用教程
- 利用运动学实现导弹仿真飞行
- 电脑上怎么批量压缩图片?如何快速批量压缩图片?
- ReactNative实现仿微信或者通讯录快速索引功能
- 计算机双系统,细说如何给电脑安装双系统
- 计算机毕业设计Python+Django的医院排队叫号系统(源码+系统+mysql数据库+Lw文档)
- Multisim10中仿真时间步长与数码显示管的类型有关
- flag.Args()和 flag.NArg()的用法
- Ae效果控件快速参考:模糊和锐化
- 浅析资源调度框架YARN
- windows下合并多个txt,文件
- 【王道数据结构】思维导图--5.2二叉树的概念(高清)
- win10以及win10企业版安装ubuntu子系统
- python 循环引用的解决方法
- [附源码]Python计算机毕业设计大学生体检管理系统Django(程序+LW)
热门文章
- 北京电视台《解码区块链》 ——国内首家真正的区块链商品溯源应用来了!
- Error: (‘IM002‘, ‘[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序‘)
- drawrect的使用
- uniapp点击拨打电话
- ceres非线性优化(分析推导雅克比矩阵例子)
- PaaS 以及全套服务微服务搭建流程
- 什么是接口测试?这篇文章让你明白
- 用docker搭建家庭娱乐服务器
- 歌尔微电子递交上会稿:半年营收14.6亿 拟募资32亿
- RH134-04 计划任务