今天听的分享里在介绍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. webView加载url,加载指定字符串

    //加载url-(void)addWebView{ UIWebView * webView = [[UIWebView alloc] initWithFrame:CGRectMake(, , zScr ...

  2. Spring使用原生JDBC

    Spring使用原生JDBC 为加深对Spring解耦的理解,本次实验学习用Spring连接JDBC 一.POM配置文件 pom.xml <project xmlns="http:// ...

  3. 编写CentOS的System V init启动脚本

    系统本身自带了说明,在/usr/share/doc/initscripts-(*)/sysvinitfiles,内容如下: 所有System V init脚本都命名为/etc/rc.d/init.d/ ...

  4. wget整站抓取、网站抓取功能;下载整个网站;下载网站到本地

    wget -r   -p -np -k -E  http://www.xxx.com 抓取整站 wget -l 1 -p -np -k       http://www.xxx.com 抓取第一级 - ...

  5. vue把localhost改成ip地址无法访问—解决方法

    打开package.json文件,找到下面的代码 "scripts": { "dev": "webpack-dev-server --inline - ...

  6. js-工具函数

    /** * 将文件大小转换成 ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],单位 * @param bytes * @returns */ ...

  7. IDEA修改JDK(全)

    https://www.cnblogs.com/hkgov/p/8074085.html 解决:javac: 无效的目标发行版: 1.8 解决:项目JDK版本不对 解决:Jar包问题 1," ...

  8. js 动态生成html 触发事件传参字符转义

    通常,在使用 JS 动态生成 html 的过程中,会嵌入相应的样式.事件等属性元素,而这时经常会出现所谓的 “单.双引号不够用” 的情况,别急,这时可以利用 html 语言中的转义字符来解决.下面就来 ...

  9. python两个 list 获取交集,并集,差集的方法

    1. 获取两个list 的交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] # ...

  10. AYUI -AYUI风格的 超美 百度网盘8.0

    2017-03-23 19:18:43 (截止到2017-3-23 20:20:33开发结束)体验地址:  http://pan.baidu.com/s/1bX28H4 新增传输列表 ======== ...