今天听的分享里在介绍String时,提到了javap,学习了好久的java,但是好像从来没有了解过这个工具。

javap是JDK提供的一个命令行工具,javap能对给定的class文件提供的字节代码进行反编译。

通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作,对更深入地理解如何提高程序执行的效率等问题有极大的帮助。

使用格式

javap <options> <classes>

常用: javap -c -v 类名

  -help  --help  -?        输出此用法消息
-version 版本信息
-v -verbose 输出附加信息
-l 输出行号和本地变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类
和成员 (默认)
-p -private 显示所有类和成员
-c 对代码进行反汇编
-s 输出内部类型签名
-sysinfo 显示正在处理的类的
系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置

新建Hello.java

public class Hello {
private Integer aa = ;
public String ss = "sss";
public static void main(String[] args) {
System.out.println("Hello Java");
}
}

不带参数

javap Hello

Compiled from "Hello.java"
public class Hello {
public java.lang.String ss;
public Hello();
public static void main(java.lang.String[]);
}

对代码进行反汇编

javap -c  Hello

Compiled from "Hello.java"
public class Hello {
public java.lang.String ss; public Hello();
Code:
: aload_0
: invokespecial # // Method java/lang/Object."<init>":
()V
: aload_0
: iconst_1
: invokestatic # // Method java/lang/Integer.valueOf:
(I)Ljava/lang/Integer;
: putfield # // Field aa:Ljava/lang/Integer;
: aload_0
: ldc # // String sss
: putfield # // Field ss:Ljava/lang/String;
: return public static void main(java.lang.String[]);
Code:
: getstatic # // Field java/lang/System.out:Ljava/
io/PrintStream;
: ldc # // String Hello Java
: invokevirtual # // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
: return
}
输出附加信息
javap -v Hello
Classfile /D:/WWW//javap/Hello.class
Last modified --; size bytes
MD5 checksum 9eb7401f16043460fa36db8275c0f7c4
Compiled from "Hello.java"
public class Hello
minor version:
major version:
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
# = Methodref #.# // java/lang/Object."<init>":()V
# = Methodref #.# // java/lang/Integer.valueOf:(I)Ljava/
lang/Integer;
# = Fieldref #.# // Hello.aa:Ljava/lang/Integer;
# = String # // sss
# = Fieldref #.# // Hello.ss:Ljava/lang/String;
# = Fieldref #.# // java/lang/System.out:Ljava/io/Print
Stream;
# = String # // Hello Java
# = Methodref #.# // java/io/PrintStream.println:(Ljava/
lang/String;)V
# = Class # // Hello
# = Class # // java/lang/Object
# = Utf8 aa
# = Utf8 Ljava/lang/Integer;
# = Utf8 ss
# = Utf8 Ljava/lang/String;
# = Utf8 <init>
# = Utf8 ()V
# = Utf8 Code
# = Utf8 LineNumberTable
# = Utf8 main
# = Utf8 ([Ljava/lang/String;)V
# = Utf8 SourceFile
# = Utf8 Hello.java
# = NameAndType #:# // "<init>":()V
# = Class # // java/lang/Integer
# = NameAndType #:# // valueOf:(I)Ljava/lang/Integer;
# = NameAndType #:# // aa:Ljava/lang/Integer;
# = Utf8 sss
# = NameAndType #:# // ss:Ljava/lang/String;
# = Class # // java/lang/System
# = NameAndType #:# // out:Ljava/io/PrintStream;
# = Utf8 Hello Java
# = Class # // java/io/PrintStream
# = NameAndType #:# // println:(Ljava/lang/String;)V
# = Utf8 Hello
# = Utf8 java/lang/Object
# = Utf8 java/lang/Integer
# = Utf8 valueOf
# = Utf8 (I)Ljava/lang/Integer;
# = Utf8 java/lang/System
# = Utf8 out
# = Utf8 Ljava/io/PrintStream;
# = Utf8 java/io/PrintStream
# = Utf8 println
# = Utf8 (Ljava/lang/String;)V
{
public java.lang.String ss;
descriptor: Ljava/lang/String;
flags: ACC_PUBLIC public Hello();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=, locals=, args_size=
: aload_0
: invokespecial # // Method java/lang/Object."<init>
":()V
: aload_0
: iconst_1
: invokestatic # // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
: putfield # // Field aa:Ljava/lang/Integer;
: aload_0
: ldc # // String sss
: putfield # // Field ss:Ljava/lang/String;
: return
LineNumberTable:
line :
line :
line : public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=, locals=, args_size=
: getstatic # // Field java/lang/System.out:Ljav
a/io/PrintStream;
: ldc # // String Hello Java
: invokevirtual # // Method java/io/PrintStream.prin
tln:(Ljava/lang/String;)V
: return
LineNumberTable:
line :
line :
}
SourceFile: "Hello.java"
输出行号和本地变量表
javap -l Hello
Compiled from "Hello.java"
public class Hello {
public java.lang.String ss; public Hello();
LineNumberTable:
line :
line :
line : public static void main(java.lang.String[]);
LineNumberTable:
line :
line :
}

javap -p Hello

Compiled from "Hello.java"
public class Hello {
private java.lang.Integer aa;
public java.lang.String ss;
public Hello();
public static void main(java.lang.String[]);
}

javap -public Hello

Compiled from "Hello.java"
public class Hello {
public java.lang.String ss;
public Hello();
public static void main(java.lang.String[]);
}

javap -private Hello

Compiled from "Hello.java"
public class Hello {
private java.lang.Integer aa;
public java.lang.String ss;
public Hello();
public static void main(java.lang.String[]);
}
输出内部类型签名
javap -s Hello
Compiled from "Hello.java"
public class Hello {
public java.lang.String ss;
descriptor: Ljava/lang/String;
public Hello();
descriptor: ()V public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
}
显示正在处理的类的
javap -sysinfo  Hello
Classfile /D:/WWW//javap/Hello.class
Last modified --; size bytes
MD5 checksum 9eb7401f16043460fa36db8275c0f7c4
Compiled from "Hello.java"
public class Hello {
public java.lang.String ss;
public Hello();
public static void main(java.lang.String[]);
}

javap的使用的更多相关文章

  1. java自带工具-javap使用

    javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作,有助与我们更加理解java特性. javap(反汇编命令) ...

  2. javap反编译解释外部类直接使用内部类private字段的原理

    2016-07-04 15:56:39 我们都知道: 1.内部类可以直接访问外部类的private字段和方法: 2.非静态内部类持有外部类的引用: 3.外部类可以直接访问内部类的private字段和方 ...

  3. javap查看class文件

    通过JVM编译java文件生成class字节码文件,很多时候很想用工具打开看看,目前还不清楚哪一个软件专门查看class文件的,但是通过windows下的javap命令可以查看详细的class文件 S ...

  4. windows命令行下简单使用javac、java、javap详细演示

    最近重新复习了一下java基础,在使用javap的过程中遇到了一些问题,这里便讲讲对于一个类文件如何编译.运行.反编译的.也让自己加深一下印象. 如题,首先我们在桌面,开始->运行->键入 ...

  5. Eclipse集成javap查看字节码

    分析java语言特性的一个好帮手是使用javap工具查看java编译后的字节码,楼主今天在学习java泛型中的桥方法时遇到一些不解,想到javap这个好工具可以帮助解答一些疑惑,索性就捣鼓如何在ecl ...

  6. 命令查看java的class字节码文件、verbose、synchronize、javac、javap

    查看Java字节码 1 javac –verbose查看运行类是加载了那些jar文件 HelloWorld演示: public class Test { public static void main ...

  7. how to use javap command

    SYNOPSIS javap [options] classes DESCRIPTION The javap command is called "disassembler" be ...

  8. 使用javap反编译class文件

    一个普通的Java类: package org.ccnt.concurrence; public class VolatileTest { public static volatile int rac ...

  9. javap(反汇编命令)详解【转】

    转自:http://blog.csdn.net/hudashi/article/details/7062668 javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们 ...

  10. Eclipse中使用javap运行配置详解

    javap是sun提供的对class文件进行反编译的工具 1.配置Run---external tools---external tools configurations 选择Program 新建ja ...

随机推荐

  1. Java Socket基本使用

    首先 编写Client程序: import java.io.IOException; import java.net.Socket; import java.util.Scanner; public ...

  2. Alpha冲刺(4/10)——2019.4.27

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(4/10)--2019.4.27 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  3. ionic2 (真正)修改应用图标和启动画面

    今天在用ionic2 的ionic resources生成新的icon和splash,生成后安装,应用图标和启动画面依然没变化... 不知道大家有没有被坑过,今天被坑了一下午,终于找到了办法: 解决方 ...

  4. db2 load报文件系统满

    使用db2 load导入数据 数据量比较大时常常会报文件系统已满错误. 原因分析:导入表建有索引,在load的“索引复制”阶段会从系统临时表空间拷贝到目标表空间,导致系统临时表空间所在的文件系统满,l ...

  5. Jmeter压力测试(简单的http请求)-实例

    服务端系分提供的某接口样例为: 评估后可采用使用jmeter进行压力测试的步骤为: 启动jmeter:在bin下点击jmeter.bat,运行jmeter 2. 创建测试计划: 默认启动jmeter时 ...

  6. docker中mysql数据库的数据导入和导出

    导出数据 查看下 mysql 运行名称 docker ps 结果:  执行导出(备份)数据库命令: 由第一步的结果可知,我们的 mysql 运行在一个叫 mysql_server 的 docker ...

  7. TensorFlow保存和载入模型

    首先定义一个tf.train.Saver类: saver = tf.train.Saver(max_to_keep=1) 其中,max_to_keep参数设定只保存最后一个参数,默认值是5,即保存最后 ...

  8. 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替

    /// <summary> /// 正则双重过滤 /// splitKey1 第一个正则式匹配 /// splitKey2 匹配结果中再次匹配进行替换 /// </summary&g ...

  9. iOS CALayer 绘图模糊有锯齿的解决方案

    在CALayer中绘制图形会出现锯齿和模糊,同样绘图在UIView中就没有问题.经查资料发现不自动处理两倍像素的情况. 解决方案为:设置layer的contentsScale属性为[[UIScreen ...

  10. 开源中文分词工具探析(七):LTP

    LTP是哈工大开源的一套中文语言处理系统,涵盖了基本功能:分词.词性标注.命名实体识别.依存句法分析.语义角色标注.语义依存分析等. [开源中文分词工具探析]系列: 开源中文分词工具探析(一):ICT ...