当前位置: 首页 > news >正文

Java命令学习系列(七)——javap

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。

一般情况下,很少有人使用javap对class文件进行反编译,因为有很多成熟的反编译工具可以使用,比如jad。但是,javap还可以查看java编译器为我们生成的字节码。通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。

实例

javap命令分解一个class文件,它根据options来决定到底输出什么。如果没有使用options,那么javap将会输出包,类里的protected和public域以及类里的所有方法。javap将会把它们输出在标准输出上。来看这个例子,先编译(javac)下面这个类。

import java.awt.*; import java.applet.*; public class DocFooter extends Applet { String date; String email; public void init() { resize(500,100); date = getParameter("LAST_UPDATED"); email = getParameter("EMAIL"); } public void paint(Graphics g) { g.drawString(date + " by ",100, 15); g.drawString(email,290,15); } }

在命令行上键入javap DocFooter后,输出结果如下

Compiled from "DocFooter.java" public class DocFooter extends java.applet.Applet { java.lang.String date; java.lang.String email; public DocFooter(); public void init(); public void paint(java.awt.Graphics); }

如果加入了-c,即javap -c DocFooter,那么输出结果如下

Compiled from "DocFooter.java" public class DocFooter extends java.applet.Applet { java.lang.String date; java.lang.String email; public DocFooter(); Code: 0: aload_0 1: invokespecial #1 // Method java/applet/Applet."<init>":()V 4: return public void init(); Code: 0: aload_0 1: sipush 500 4: bipush 100 6: invokevirtual #2 // Method resize:(II)V 9: aload_0 10: aload_0 11: ldc #3 // String LAST_UPDATED 13: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String; 16: putfield #5 // Field date:Ljava/lang/String; 19: aload_0 20: aload_0 21: ldc #6 // String EMAIL 23: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String; 26: putfield 

相关文章:

  • 点滴积累【C#】---将Excel数据导入到数据库
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • JS操作DOM的几个属性与方法
  • 201771010101 白玛次仁《面向对象程序设计(Java)》第十一周学习总结
  • 【持续更新】jQuery 实用技巧
  • 学JS的心路历程-函式(五)箭头函式
  • 【转】Ruby入门教程(一)
  • 进程【TLCL】
  • 深入数据库索引背后算法及数据结构
  • 基于游标的分页接口实现
  • Docker1---安装
  • 如何利用极致业务基础平台构建一个通用企业ERP之十二收款单设计
  • 如何给esxi打补丁
  • OpenCart之信息中心(Information)模块教程
  • KbmMW 4.40.00 正式版发布
  • Codepen 每日精选(2018-3-25)
  • JS+CSS实现数字滚动
  • MySQL用户中的%到底包不包括localhost?
  • node和express搭建代理服务器(源码)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring Boot MyBatis配置多种数据库
  • webpack入门学习手记(二)
  • Windows Containers 大冒险: 容器网络
  • Xmanager 远程桌面 CentOS 7
  • 创建一个Struts2项目maven 方式
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 全栈开发——Linux
  • 数据仓库的几种建模方法
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #Linux(帮助手册)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (23)Linux的软硬连接
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (solr系列:一)使用tomcat部署solr服务
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)linux使用docker容器运行mysql
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (四)c52学习之旅-流水LED灯
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • *1 计算机基础和操作系统基础及几大协议
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .Net 8.0 新的变化
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net framework4与其client profile版本的区别
  • .net 托管代码与非托管代码
  • .NET/C# 的字符串暂存池
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .NET中使用Redis (二)
  • .net中我喜欢的两种验证码
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @RequestBody与@ResponseBody的使用
  • @Service注解让spring找到你的Service bean
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)