javap的使用
今天听的分享里在介绍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[]);
}
c 对代码进行反汇编
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的使用的更多相关文章
- java自带工具-javap使用
javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作,有助与我们更加理解java特性. javap(反汇编命令) ...
- javap反编译解释外部类直接使用内部类private字段的原理
2016-07-04 15:56:39 我们都知道: 1.内部类可以直接访问外部类的private字段和方法: 2.非静态内部类持有外部类的引用: 3.外部类可以直接访问内部类的private字段和方 ...
- javap查看class文件
通过JVM编译java文件生成class字节码文件,很多时候很想用工具打开看看,目前还不清楚哪一个软件专门查看class文件的,但是通过windows下的javap命令可以查看详细的class文件 S ...
- windows命令行下简单使用javac、java、javap详细演示
最近重新复习了一下java基础,在使用javap的过程中遇到了一些问题,这里便讲讲对于一个类文件如何编译.运行.反编译的.也让自己加深一下印象. 如题,首先我们在桌面,开始->运行->键入 ...
- Eclipse集成javap查看字节码
分析java语言特性的一个好帮手是使用javap工具查看java编译后的字节码,楼主今天在学习java泛型中的桥方法时遇到一些不解,想到javap这个好工具可以帮助解答一些疑惑,索性就捣鼓如何在ecl ...
- 命令查看java的class字节码文件、verbose、synchronize、javac、javap
查看Java字节码 1 javac –verbose查看运行类是加载了那些jar文件 HelloWorld演示: public class Test { public static void main ...
- how to use javap command
SYNOPSIS javap [options] classes DESCRIPTION The javap command is called "disassembler" be ...
- 使用javap反编译class文件
一个普通的Java类: package org.ccnt.concurrence; public class VolatileTest { public static volatile int rac ...
- javap(反汇编命令)详解【转】
转自:http://blog.csdn.net/hudashi/article/details/7062668 javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们 ...
- Eclipse中使用javap运行配置详解
javap是sun提供的对class文件进行反编译的工具 1.配置Run---external tools---external tools configurations 选择Program 新建ja ...
随机推荐
- 选择客栈 [NOIP 2011]
这种题我还要发博客我真是太弱蒻了 Description 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从1 到n 编号.每家客栈都按照某一种色调进行装饰(总共k 种,用整数0 ~ k-1 表示) ...
- Git删除本地修改
git如何删除本地所有未提交的更改 git checkout . && git clean -xdf 一般 git clean都是配合git reset 使用的 如果你有的修改已经加入 ...
- NodeJS 模块&函数
NodeJS 模块&函数 nodejs的多文件操作通过模块系统实现,模块和文件一一对应.文件本身可以是javascript代码.JSON或编译过的C/C++扩展 基本用法 nodeJS通过ex ...
- JS_高程4.变量,作用域和内存问题(1)
1.基本类型和应用类型的值 ECMAScript变量可能包含两种不同数据类型的值: 基本类型值——简单的数据段.(5种基本的数据类型,按值访问,因为可以操作保存在变量中的实际的值.) 引用类型值——多 ...
- 修改Arduino IDE默认字体
文件->首选项 点击直接编辑下面那个文件 修改editor.font这个条目就可以不用那么毁眼了..
- MyBatis(五):mybatis关联映射
Mybatis中表与表之间的关系分为一下4类: 1)一对一 2)一对多 3)多对一 4)多对多 创建数据Demo表 数据库表: 用户表user:记录了购买商品的用户信息. 订单表orders:记录了用 ...
- ImportError: No module named _tkinter on macos
MAC OS 10.11.6 lMacBook-Pro:~ xiaomilbq$ python Python 2.7.14 (default, Sep 22 2017, 00:05:22) [GCC ...
- 【JavaScript从入门到精通】第一课 初探JavaScript魅力-01
第一课 初探JavaScript魅力-01 JavaScript是什么 如今我们打开一个大型的网站,都会有很多JS效果的功能和应用.对于学过CSS+HTML的同学,即使是像淘宝那样的网站,用一两天时间 ...
- 数据分析:基于Python的自定义文件格式转换系统
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 每天一个linux命令(6):cp
1.命令简介 cp(Copy file):将源文件复制至目标文件,或将多个源文件复制至目标目录. 2.用法 cp [选项]... [-T] 源文件 目标文件 或:cp [选项]... 源文件... 目 ...