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 ...
随机推荐
- webView加载url,加载指定字符串
//加载url-(void)addWebView{ UIWebView * webView = [[UIWebView alloc] initWithFrame:CGRectMake(, , zScr ...
- Spring使用原生JDBC
Spring使用原生JDBC 为加深对Spring解耦的理解,本次实验学习用Spring连接JDBC 一.POM配置文件 pom.xml <project xmlns="http:// ...
- 编写CentOS的System V init启动脚本
系统本身自带了说明,在/usr/share/doc/initscripts-(*)/sysvinitfiles,内容如下: 所有System V init脚本都命名为/etc/rc.d/init.d/ ...
- wget整站抓取、网站抓取功能;下载整个网站;下载网站到本地
wget -r -p -np -k -E http://www.xxx.com 抓取整站 wget -l 1 -p -np -k http://www.xxx.com 抓取第一级 - ...
- vue把localhost改成ip地址无法访问—解决方法
打开package.json文件,找到下面的代码 "scripts": { "dev": "webpack-dev-server --inline - ...
- js-工具函数
/** * 将文件大小转换成 ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],单位 * @param bytes * @returns */ ...
- IDEA修改JDK(全)
https://www.cnblogs.com/hkgov/p/8074085.html 解决:javac: 无效的目标发行版: 1.8 解决:项目JDK版本不对 解决:Jar包问题 1," ...
- js 动态生成html 触发事件传参字符转义
通常,在使用 JS 动态生成 html 的过程中,会嵌入相应的样式.事件等属性元素,而这时经常会出现所谓的 “单.双引号不够用” 的情况,别急,这时可以利用 html 语言中的转义字符来解决.下面就来 ...
- 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] # ...
- AYUI -AYUI风格的 超美 百度网盘8.0
2017-03-23 19:18:43 (截止到2017-3-23 20:20:33开发结束)体验地址: http://pan.baidu.com/s/1bX28H4 新增传输列表 ======== ...