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 ...
随机推荐
- JavaScript 对象拷贝研究
介绍一下JavaScript里面的一些对象拷贝的方法 浅拷贝 深拷贝 利用序列化进行对象拷贝
- CSS学习之路,指定值,计算值,使用值。
前面被问过这几个值得区别,没太研究,有点抠文字的感觉,既然到这儿了 ,就简答梳理下吧. 指定值(specified value):通过样式表样式规则定义的值:可以来自层叠样式表,如果没有指定,则考虑父 ...
- 用C++实现半透明按钮控件(PNG,GDI+)
使用MFC实现上面的按钮半透明效果能看到父窗口中的内容,上面是效果图(一个是带背景图片的.另一个是不带的). 控件继承自CWnd类(彩色的部分是窗口的背景图片.按钮是PNG图片,第二个图标是鼠 ...
- 解决错误:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package.
原因是代码直接放在默认包里边,比如src\main\java目录下 应该在src\main\java下建立子目录,比如src\main\java\com\test 这样的话,代码就在com.test这 ...
- Spring Boot 中application.yml与bootstrap.yml的区别
其实yml和properties文件是一样的原理,且一个项目上要么yml或者properties,二选一的存在. 推荐使用yml,更简洁. bootstrap与application1.加载顺序这里主 ...
- 访问天地图WMTS服务的正确姿势
天地图2018版对天地图应用开发流程进行了升级改造,主要有两点变化: (1)接口升级为tianditu.gov.cn政府域名,支持HTTP/HTTPS协议,原有服务域名tianditu.com继续保留 ...
- C# System.IO.FileMode
字段 Append 6 若存在文件,则打开该文件并查找到文件尾,或者创建一个新文件. 这需要 Append 权限. FileMode.Append 只能与 FileAccess.Write 一起使用. ...
- (原)tensorflow使用eager在mnist上训练的简单例子
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9989586.html 代码网址: https://github.com/darkknightzh/t ...
- 评分模型的检验方法和标准&信用评分及实现
评分模型的检验方法和标准通常有:K-S指标.交换曲线.AR值.Gini数等.例如,K-S指标是用来衡量验证结果是否优于期望值,具体标准为:如果K-S大于40%,模型具有较好的预测功能,发展的模型具有成 ...
- Linux 下的 sleep
最近在阅读 libev 的源码,看到 libev 的代码里面的 sleep 实现, 我觉得可以把这个 sleep 实现单独拿出来,作为参考,以后可以直接拿来用. 代码如下(稍有修改): void ev ...