java6虚拟机_Java 虚拟机之六:javap工具

一:简介

javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。

javap命令的常用参数有:

-l 打印行和本地变量表

-public 只显示公共类和成员变量

-protected  只显示公共的、受保护的类和变量

-private  显示所有的类和成员变量

-p  显示所有的类和成员变量

-Joption   给jvm指定参数,例如:

javap -J-version

javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy

-s 打印内部类型签名(用于泛型)

-sysinfo 打印被处理类的系统信息(路径,大小,日志,MD5哈希)

-constants 显示static final常量

-c 输出分解后的代码。例如,类中每一个方法内,包含java字节码的指令

-verbose  输出栈大小,变量(locals)和方法参数的个数

-classpath path 指定查询类的路径.如果设置该值,则会覆盖默认值和CLASSPATH环境变量。

-bootclasspath path 指定启动类的路径,默认值是jre/lib/rt.jar 和 其他少数的jar.

-extdir dirs  覆盖 java.ext.dirs路径

二:实例

1.Java源代码

public class Demo {

private String name = "张三";

public static void main(String args[]) {

System.out.println("Hello World.");

}

private void sayHello() {

System.out.println("Hello " + name);

}

}

2.javac编译后的字节码

CA FE BA BE 00 00 00 34  00 36 0A 00 0D 00 1E 08

00 1F 09 00 0C 00 20 09  00 21 00 22 08 00 23 0A

00 24 00 25 07 00 26 0A  00 07 00 1E 08 00 27 0A

00 07 00 28 0A 00 07 00  29 07 00 2A 07 00 2B 01

00 04 6E 61 6D 65 01 00  12 4C 6A 61 76 61 2F 6C

61 6E 67 2F 53 74 72 69  6E 67 3B 01 00 06 3C 69

6E 69 74 3E 01 00 03 28  29 56 01 00 04 43 6F 64

65 01 00 0F 4C 69 6E 65  4E 75 6D 62 65 72 54 61

62 6C 65 01 00 12 4C 6F  63 61 6C 56 61 72 69 61

62 6C 65 54 61 62 6C 65  01 00 04 74 68 69 73 01

00 28 4C 63 6F 6D 2F 62  72 69 6C 6C 69 61 6E 74

73 74 61 72 2F 63 69 6D  63 2F 69 6D 2F 64 65 73

6B 74 6F 70 2F 44 65 6D  6F 3B 01 00 04 6D 61 69

6E 01 00 16 28 5B 4C 6A  61 76 61 2F 6C 61 6E 67

2F 53 74 72 69 6E 67 3B  29 56 01 00 04 61 72 67

73 01 00 13 5B 4C 6A 61  76 61 2F 6C 61 6E 67 2F

53 74 72 69 6E 67 3B 01  00 08 73 61 79 48 65 6C

6C 6F 01 00 0A 53 6F 75  72 63 65 46 69 6C 65 01

00 09 44 65 6D 6F 2E 6A  61 76 61 0C 00 10 00 11

01 00 06 E5 BC A0 E4 B8  89 0C 00 0E 00 0F 07 00

2C 0C 00 2D 00 2E 01 00  0C 48 65 6C 6C 6F 20 57

6F 72 6C 64 2E 07 00 2F  0C 00 30 00 31 01 00 17

6A 61 76 61 2F 6C 61 6E  67 2F 53 74 72 69 6E 67

42 75 69 6C 64 65 72 01  00 06 48 65 6C 6C 6F 20

0C 00 32 00 33 0C 00 34  00 35 01 00 26 63 6F 6D

2F 62 72 69 6C 6C 69 61  6E 74 73 74 61 72 2F 63

69 6D 63 2F 69 6D 2F 64  65 73 6B 74 6F 70 2F 44

65 6D 6F 01 00 10 6A 61  76 61 2F 6C 61 6E 67 2F

4F 62 6A 65 63 74 01 00  10 6A 61 76 61 2F 6C 61

6E 67 2F 53 79 73 74 65  6D 01 00 03 6F 75 74 01

00 15 4C 6A 61 76 61 2F  69 6F 2F 50 72 69 6E 74

53 74 72 65 61 6D 3B 01  00 13 6A 61 76 61 2F 69

6F 2F 50 72 69 6E 74 53  74 72 65 61 6D 01 00 07

70 72 69 6E 74 6C 6E 01  00 15 28 4C 6A 61 76 61

2F 6C 61 6E 67 2F 53 74  72 69 6E 67 3B 29 56 01

00 06 61 70 70 65 6E 64  01 00 2D 28 4C 6A 61 76

61 2F 6C 61 6E 67 2F 53  74 72 69 6E 67 3B 29 4C

6A 61 76 61 2F 6C 61 6E  67 2F 53 74 72 69 6E 67

42 75 69 6C 64 65 72 3B  01 00 08 74 6F 53 74 72

69 6E 67 01 00 14 28 29  4C 6A 61 76 61 2F 6C 61

6E 67 2F 53 74 72 69 6E  67 3B 00 21 00 0C 00 0D

00 00 00 01 00 02 00 0E  00 0F 00 00 00 03 00 01

00 10 00 11 00 01 00 12  00 00 00 39 00 02 00 01

00 00 00 0B 2A B7 00 01  2A 12 02 B5 00 03 B1 00

00 00 02 00 13 00 00 00  0A 00 02 00 00 00 13 00

04 00 14 00 14 00 00 00  0C 00 01 00 00 00 0B 00

15 00 16 00 00 00 09 00  17 00 18 00 01 00 12 00

00 00 37 00 02 00 01 00  00 00 09 B2 00 04 12 05

B6 00 06 B1 00 00 00 02  00 13 00 00 00 0A 00 02

00 00 00 17 00 08 00 18  00 14 00 00 00 0C 00 01

00 00 00 09 00 19 00 1A  00 00 00 02 00 1B 00 11

00 01 00 12 00 00 00 4B  00 03 00 01 00 00 00 1D

B2 00 04 BB 00 07 59 B7  00 08 12 09 B6 00 0A 2A

B4 00 03 B6 00 0A B6 00  0B B6 00 06 B1 00 00 00

02 00 13 00 00 00 0A 00  02 00 00 00 1B 00 1C 00

1C 00 14 00 00 00 0C 00  01 00 00 00 1D 00 15 00

16 00 00 00 01 00 1C 00  00 00 02 00 1D

3.javap返汇编后的内容

javap -p -v Demo

默认情况下javap会打印所有非私有的字段和方法,当加了-p选项后,它还将打印私有的字段和方法;-v 它尽可能地打印所有信息。如果只需要查询方法对应的字节码,那么可以用-c代替-v.

=================基本信息(涵盖了原class文件的相关信息)=======================

Classfile /D:/workspace/donkey/cimc-im-desktop/target/classes/com/brilliantstar/cimc/im/desktop/Demo.class

Last modified 2018-9-6; size 909 bytes

MD5 checksum 0f9cd841c4a2ab1f6a00163e55ca6e0f

Compiled from "Demo.java"

public class com.brilliantstar.cimc.im.desktop.Demo

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

=================常量池(用来存放各种常量及符号引用)=======================

Constant pool:

#1 = Methodref          #13.#30        // java/lang/Object."":()V

#2 = String             #31            // 张三

#3 = Fieldref           #12.#32        // com/brilliantstar/cimc/im/desktop/Demo.name:Ljava/lang/String;

#4 = Fieldref           #33.#34        // java/lang/System.out:Ljava/io/PrintStream;

#5 = String             #35            // Hello World.

#6 = Methodref          #36.#37        // java/io/PrintStream.println:(Ljava/lang/String;)V

#7 = Class              #38            // java/lang/StringBuilder

#8 = Methodref          #7.#30         // java/lang/StringBuilder."":()V

#9 = String             #39            // Hello

#10 = Methodref          #7.#40         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

#11 = Methodref          #7.#41         // java/lang/StringBuilder.toString:()Ljava/lang/String;

#12 = Class              #42            // com/brilliantstar/cimc/im/desktop/Demo

#13 = Class              #43            // java/lang/Object

#14 = Utf8               name

#15 = Utf8               Ljava/lang/String;

#16 = Utf8               

#17 = Utf8               ()V

#18 = Utf8               Code

#19 = Utf8               LineNumberTable

#20 = Utf8               LocalVariableTable

#21 = Utf8               this

#22 = Utf8               Lcom/brilliantstar/cimc/im/desktop/Demo;

#23 = Utf8               main

#24 = Utf8               ([Ljava/lang/String;)V

#25 = Utf8               args

#26 = Utf8               [Ljava/lang/String;

#27 = Utf8               sayHello

#28 = Utf8               SourceFile

#29 = Utf8               Demo.java

#30 = NameAndType        #16:#17        // "":()V

#31 = Utf8               张三

#32 = NameAndType        #14:#15        // name:Ljava/lang/String;

#33 = Class              #44            // java/lang/System

#34 = NameAndType        #45:#46        // out:Ljava/io/PrintStream;

#35 = Utf8               Hello World.

#36 = Class              #47            // java/io/PrintStream

#37 = NameAndType        #48:#49        // println:(Ljava/lang/String;)V

#38 = Utf8               java/lang/StringBuilder

#39 = Utf8               Hello

#40 = NameAndType        #50:#51        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

#41 = NameAndType        #52:#53        // toString:()Ljava/lang/String;

#42 = Utf8               com/brilliantstar/cimc/im/desktop/Demo

#43 = Utf8               java/lang/Object

#44 = Utf8               java/lang/System

#45 = Utf8               out

#46 = Utf8               Ljava/io/PrintStream;

#47 = Utf8               java/io/PrintStream

#48 = Utf8               println

#49 = Utf8               (Ljava/lang/String;)V

#50 = Utf8               append

#51 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;

#52 = Utf8               toString

#53 = Utf8               ()Ljava/lang/String;

{

===============字段区域(用来列举该类中的各个字段)===================

private java.lang.String name;

descriptor: Ljava/lang/String;

flags: ACC_PRIVATE

public com.brilliantstar.cimc.im.desktop.Demo();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=2, locals=1, args_size=1

0: aload_0

1: invokespecial #1                  // Method java/lang/Object."":()V

4: aload_0

5: ldc           #2                  // String 张三

7: putfield      #3                  // Field name:Ljava/lang/String;

10: return

LineNumberTable:

line 19: 0

line 20: 4

LocalVariableTable:

Start  Length  Slot  Name   Signature

0      11     0  this   Lcom/brilliantstar/cimc/im/desktop/Demo;

===============方法区域(用来列举该类中的各个方法)=========================

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=2, locals=1, args_size=1

0: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc           #5                  // String Hello World.

5: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

LineNumberTable:

line 23: 0

line 24: 8

LocalVariableTable:

Start  Length  Slot  Name   Signature

0       9     0  args   [Ljava/lang/String;

private void sayHello();

descriptor: ()V

flags: ACC_PRIVATE

Code:

stack=3, locals=1, args_size=1

0: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;

3: new           #7                  // class java/lang/StringBuilder

6: dup

7: invokespecial #8                  // Method java/lang/StringBuilder."":()V

10: ldc           #9                  // String Hello

12: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

15: aload_0

16: getfield      #3                  // Field name:Ljava/lang/String;

19: invokevirtual #10                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

22: invokevirtual #11                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;

25: invokevirtual #6                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V

28: return

LineNumberTable:

line 27: 0

line 28: 28

LocalVariableTable:

Start  Length  Slot  Name   Signature

0      29     0  this   Lcom/brilliantstar/cimc/im/desktop/Demo;

}

SourceFile: "Demo.java"

以其中的sayHello()方法为例,除了方法描述以及访问权限之外,方法中还包括最为重要的代码区域。

1).代码区域一开始会声明该方法中的操作数栈(stack=3) 和局部变量数目(locals=1)的最大值,以及该方法接收参数的个数(args_size=1)这里局部变量指的是字节码中的局部变量,而非Java程序中的局部变量。

2).接下来是该方法的字节码,每条字节码均标注了对应的偏移量,这是用来定位字节码的。

3).接下来的行数表(LineNumberTable)则是Java源程序到字节码偏移量的映射。行数表和局部变量均属于调试信息,Java虚拟机并不要求class文件必备这些信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搜狐视频app如何设置仅自己可看我的关注列表

播放器软件很多,本文播放器家园网小编给大家推荐搜狐视频。搜狐视频是当下非常流行常用的视频播放器,拥有安卓版、pc版、苹果版等适用于不同设备用户,拥有海量最新最热视频资源,精彩视频第一时间上新提醒,支持在线下载…

java中修改密码_java怎样修改用户名密码?

展开全部package changepassword;import java.util.Scanner;public class Administrator{String name;//姓名String password;//密码String inputpass;//判断是否正确的密码String newpassword;//再次输入密码String repassword;//第2输入的密码//String admin"";St…

PP视频如何设置关闭的时候直接退出程序

很多人都使用PP视频,小编给大家分享一下PP视频如何设置关闭的时候直接退出程序相关内容。如果大家还没有注册账号,那么可以注册一个,新用户还有vip奖励,当然一般也就是奖励3天或者7天的时长,直接送终身vip是不可能的&a…

java oo 封装_Java从小白到入门,Day6。JAVAOO-封装

封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。封装是一种信息隐藏技术,在java中…

腾讯视频如何设置画面对比度方面的内容

本文给大家整理了帮我下载一个腾讯视频_腾讯视频如何设置画面对比度方面的内容。腾讯视频为用户提供电影、电视剧、综艺、动漫、娱乐、热点资讯等内容,视频播放清晰流畅,操作界面简单友好。优质的正版高清视频内容、贴心的生活服务满足用户“悦享品质、时…

java 并发 变量_实例讲解Java并发编程之变量

编写线程安全需要关心的:1.共享的变量2.可变的变量共享意味着多个线程可以同时访问,可变意味着其值在生命周期可以改变。例如以下count 变量://线程不安全的类public class UnsafeCount {private int count 0; //该变量是共享的public vo…

腾讯视频下载电脑_腾讯视频如何设置允许腾讯视频驻留功能

本文给大家整理了腾讯视频下载电脑_腾讯视频如何设置允许腾讯视频驻留功能方面的内容。腾讯视频不断实践"三网合一"的使命,现已覆盖互联网、电视、移动三大终端,兼具影视、综艺、资讯三大内容形态,贯通视频内容制作、播出、发行三大…

java plug机制_【maven实战】20-插件解析机制

插件仓库:与依赖构件一样,插件构件同样基于坐标存储在maven仓库中,在需要的时候maven会从本地仓库中查找插件,如果不存在则从远程仓库查找。找到插件后在下载到本地仓库使用。值得一提的是maven会区别对待依赖的远程仓库与插件的远程仓库。当…

ie8浏览器自定义工具栏设置教程

ie8浏览器自定义工具栏设置教程 ie8浏览器自定义工具栏怎么设置?在使用IE8的网友知道,在安装IE8之后会发现IE8的工具栏中的按钮非常少,明显的不便于我们平时的上网操作。所以我们有必要根据自己的需求,把一些能够经常使用的按钮添加到工具栏…

java servlet 获取mac地址_Java开发网 - 请教大家几个关于servlet取ip和mac地址的问题~~!...

//Java获得CPU序列号和网卡Mac地址/*利用Runtime call操作系统的命令,具体的命令取决于不同的操作系统,注意不要调用Runtime.getRuntime().exec(String)接口,要用Runtime.getRuntime().exec(String[])这个接口,不然复杂命令的执行…

小城交通大转型!苏州金龙助力杭州建德公交开新格局

新安江畔,密林丛生,一辆辆绿色巴士穿梭而行,杭州市首款纯电动无站立位公交车正在试运行中。 12月19日,杭州建德,23辆苏州金龙海格牌6米无站立位新能源纯电动公交车正式交付建德市公共交通运输有限公司。自此&#xff…

手机搜狗浏览器怎么样

核心提示:手机搜狗浏览器怎么样 手机搜狗浏览器怎么样 搜狗浏览器安卓版,它是搜狗官方针对android平台上而最新推出的一款安卓手机浏览器,支持同步搜狗电脑浏览器收藏,清晰简洁,享家纯真,让你的手机上网更…

java虚拟机性能优化_死磕Java虚拟机-性能调优实战篇

Java命令分为如下三种1. 以java - 开头:标准参数2. 以java -X 开头:非标参数3. 以java -XX 开头:性能调优主要用这个开头的参数,但是无法找到相关参数的帮助文档,下面我教大家几个常用的命令-XX:UseSerialGC Seria…

让IE浏览器提示下载或直接打开word文档

核心提示:点击一个指向.doc类型的文件后,怎样不直接在IE里打开,而是弹出一个对话框提示用户想下载还是打开。让IE浏览器提示下载或直接打开word文档 点击一个指向.doc类型的文件后,怎样不直接在IE里打开,而是弹出一个…

2345王牌浏览器九宫格个性化设置

核心提示:2345王牌浏览器九宫格中的每个小窗体显示的网址,都可以进行个性化定制。 2345王牌浏览器九宫格中的每个小窗体显示的网址,都可以进行个性化定制。可以单击 2345王牌浏览器九宫格个性化设置 对某一网页进行编辑 。 可以修改你想要…

java volatile 原子性_Java中volatile不能保证原子性的证明

Java并发编程之验证volatile不能保证原子性通过系列文章的学习,凯哥已经介绍了volatile的三大特性。1:保证可见性 2:不保证原子性 3:保证顺序。那么怎么来验证可见性呢?本文凯哥(凯哥Java:kaigejava)将通过代码演示来证…

搜狐视频怎么清除应用缓存

今天继续给大家分享搜狐视频方面的内容。搜狐视频播放器是播放器家园网小编用过最好用的一款,在这里能够不同类型的电视剧和电影,都是采用了4K级高清画质,让你随时感受到电影级别的视觉盛宴!搜狐视频客户端支持边下载边观看,云同步…

mysql 漏洞如何修复_Mysql漏洞修复方法思路及注意事项

【系统环境】系统环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga) 5.7.16 MySQL Community Server (GPL)【漏洞信息】漏洞信息报告,根据集团第三方软件扫描出对应数据库版本的漏洞信息,可以从DVE号跟当前数据库发布版本时间来判…

爱奇艺视频怎么联系在线人工客服?

爱奇艺视頻是一款非常好的视頻,播放器家园网小编在闲的无聊的情况下,便会应用爱奇艺看来视頻,坚信大家也会应用爱奇艺视頻看来视頻,我们在应用爱奇艺的情况下,便会碰到些难题,今日小编给你详细介绍下&#…

java callback 多线程_JAVA Callback效率测试

在最近的联网电商项目中,想要实现单个web容器内的支付请求,全部能够统一宏观上同步,实现粒度上面异步,找来找去,没有相关方面的框架或者方案,于是最后基于现实场景,打算使用Java callback 的多线…