- 浏览: 1250996 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (399)
- 心情故事 (12)
- java (115)
- linux (55)
- 关系型数据库 (35)
- struts,jsf,spring (11)
- jdbc,hibernate,ibatis (11)
- jsp,jstl,c:tag,标签库 (2)
- ejb,webservice (1)
- tomcat,jboss,jetty,weblogic,websphere (15)
- java网络编程 (6)
- java线程 (0)
- js,jquery,json,xml,dom,html.regex (25)
- 设计模式 (6)
- BUG记录 (2)
- ant (2)
- jsp,servlet (4)
- swing (6)
- lucene+nutch (6)
- log4j (2)
- windows doc (2)
- ruby (1)
- ruby on rails (3)
- 操作系统网络 (18)
- apache 错误 (1)
- tomcat (10)
- jboss (9)
- jetty (9)
- weblogic (9)
- websphere (10)
- apache (2)
- AIX的iostat命令查看系统磁盘的使用情况 (1)
- oracle 统计一个表格有多少列 (1)
- Exception in thread "main" java.security.KeyStoreException: Windows-MY not found (1)
- jsp (1)
- jstl (1)
- c:tag (1)
- 标签库 (1)
- struts (1)
- jsf (1)
- spring (2)
- oracle,sqlplus (2)
- sqlplus (2)
- show errors (1)
- proc (1)
- function (1)
- ORA-06544: PL/SQL: internal error (1)
- arguments: [55916] (1)
- [] (7)
- 终端身份实施文档 (1)
- 重装系统之后飞鸽传书只能看到自己 (1)
- vsftp "上传 553 Could not create file" (1)
- startWebLogic.sh启动失败,提示Error initializing Embedded LDAP Server (1)
- java agent 注册为 windows 服务 (1)
- centos (1)
- svn (1)
- apr (1)
- apr-util (1)
- activemq (2)
- oracle (5)
- mysql (3)
- nosql (3)
- NSIS (1)
- windows wmic (1)
- c 指针 (1)
- c c++ (0)
- jmeter (0)
- 性能测试 (0)
- linux,备份 (2)
- C++ ,Virtual (1)
- windows dos (1)
- android (2)
- 大数据,云计算 (1)
- JVM垃圾收集 (1)
- jdbc (2)
- invoke (1)
- hibernate (1)
- ibatis (1)
- 个人开源项目源码收藏 (1)
- 批处理 (1)
- Mongodb mapreduce (8)
- kettle (1)
- Mongodb capped (1)
- mongodb gridfs (1)
- Mongodb 入门基础知识 (1)
- mongodb (8)
- hadoop2.5.1 (1)
- hadoop (4)
- eclipse (1)
- hdfs fs (1)
- elipse hadoop plugin (1)
- PHP相关知识 (1)
- js (1)
- jquery (1)
- json (1)
- xml (1)
- dom (1)
- html.regex (1)
- 网络知识 (1)
- nginx (1)
- docker (1)
- 测试 (1)
- nodejs (1)
- iptables (1)
- linux gitlab (1)
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
web页面调用window.print()函数实现打印的功能 -
hxdtech:
非常感谢!
我在学习ibatis时的培训ppt -
zmwxiaoming:
what 能连数据库不错
SOLR的学习整理 -
springdata_springmvc:
java程序语言学习教程 地址http://www.zuida ...
java获取当前操作系统的信息 -
huanzei:
整理的不错,
oracle lpad函数
javap简介
原文网址 http://www.javaresearch.org/article/768.htm .
也许我们很少会使用到javap工具,因为现在有很多好的反编译工具,但是我在此介绍这个工具不是使用它进行反编译,而是查看java编译器为我们生成
的字节码,通过比较字节码和源代码,我们可以发现很多的问题,一个很重要的作用就是了解很多编译器内部的工作机制,在笔者以前的几篇文章中就是借助此工具
的,本站有这些文章的原文《深入剖析java类的构造方式》和《使用String还是StringBuffer》。
下面我们通过具体的一个例子来简单的讲讲这个工具的作用,你不需要很深入的使用,这个简单的介绍和简单的使用就可以使你受益非浅。
源代码:
class StringTest { public static void main(String[] args) { String result=""; result+="ok"; } }
在反编译前你当然需要先编译这个类了:javac -g StringTest.java(使用-g参数是因为要得到下面javap -l时的输出需要使用此选项)
编译完成后,我们在使用不同的选项看看不同的效果:
1、先看看最简单的不带参数的情况:javap StringTest:
Compiled from StringTest.java class StringTest extends java.lang.Object { StringTest(); public static void main(java.lang.String[]); }
不带参数的情况将答应类的public信息,包括成员和方法
从上面的输出中我们确定了两个知识:如果类没有显示的从其它类派生那么它就是从Object派生;如果没有为类显示的申明构造方法,那么编译器将为之生成一个缺省构造方法(不带参数的构造方法)
2、javap -c StringTest:
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}
Method StringTest()
0 aload_0
1 invokespecial #1 <Method java.lang.Object()>
4 return
Method void main(java.lang.String[])
0 ldc #2 <String "">
2 astore_1
3 new #3 <Class java.lang.StringBuffer>
6 dup
7 invokespecial #4 <Method java.lang.StringBuffer()>
10 aload_1
11 invokevirtual #5 <Method java.lang.StringBuffer append(java.lang.String)>
14 ldc #6 <String "ok">
16 invokevirtual #5 <Method java.lang.StringBuffer append(java.lang.String)>
19 invokevirtual #7 <Method java.lang.String toString()>
22 astore_1
23 return
带-p参数将额外的打印字节码信息
前面的和不带参数的输出一样,后面的显示了方法的具体的字节码,从这个输出里面我们又可以了解更多的内容,首先
是编译器生成的的缺省构造方法的内容为调用父类的构造方法super()(需要说明的是使用DJ反编译的源代码中这个缺省构造方法没有这个调用,这可能是
该反编译器的一种优化),main()方法的字节码信息的内容可以参考《使用String还是StringBuffer》一文的叙述。
3、javap -l StringTest :
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}
Line numbers for method StringTest()
line 1: 0
Local variables for method StringTest()
StringTest this pc=0, length=5, slot=0
Line numbers for method void main(java.lang.String[])
line 5: 0
line 6: 3
line 7: 23
Local variables for method void main(java.lang.String[])
java.lang.String[] args pc=0, length=24, slot=0
java.lang.String result pc=3, length=20, slot=1
-l参数将显示行号和局部变量表
从上面的输出中我们可以得到方法中的变量和方法的源代码对于字节码信息的,例如对应main()方法,它的变量为输入参数args以及局部变量 result,方法的源代码的第5行对应字节码的第0个偏移量,第5行对应字节码的第3个偏移量,而第7行对应字节码的第23偏移量(参看 javap -c的输出前面的偏移量),第7行实际是没有语句的,但是有一个隐含的return,而偏移量23实际对应的也是return调用
4、javap -p StringTest:
class StringTest extends java.lang.Object {
StringTest();
public static void main(java.lang.String[]);
}
-p参数将额外的打印private成员和方法的信息,因为这个类没有因此输出相同
这几个参数几乎就可以构成javap的最常使用的集合,最常用的应该还是-c选项,因为可以打印字节码的信息,关于这些字节码的详细涵义在Java 虚拟机规范中定义,感兴趣的可以查看相关的信息!
发表评论
文章已被作者锁定,不允许评论。
-
centos6.5 hadoop伪分布式搭建
2017-01-10 10:41 25打算整理下machine learn ,再次安装 ... -
springboot
2016-12-29 11:13 2381微服务,现在是一个越来越热的东西,软件架构发展到 ... -
elk安装记录
2016-12-27 18:04 980在centos6.5上安装elk,记录下安装过程和 ... -
dubbo服务框架
2016-12-23 15:40 480上一篇文章介绍了zookeeper,作为服务 ... -
zookeeper服务注册中心配置
2016-12-22 11:40 1663用zookeeper有一段时间了,把配置做下简 ... -
OS X 安装java开发环境
2016-12-03 23:29 591... -
关于Restful API 的设计
2015-06-12 13:32 2275Restful API的流行,很大程度上被当前的移动 ... -
Jvisualvm远程连接tomcat配置:
2015-05-12 16:16 781JvisualVm 监控远程Tomcat,需要在To ... -
jdbc mybatis hibernate springJDBC的一些理解
2015-01-15 17:10 7064... -
Java 的ExecutorService
2015-01-15 11:45 1216早期在Java5以前,我们做多线程程序,一般都 ... -
spring的IOC和AOP
2015-01-14 16:47 2351关于Spring,大家都是耳熟 ... -
java 的线程安全
2014-12-30 14:43 958现代CPU基本都是多核,支持 ... -
JVM ClassLoader
2014-12-25 16:33 935JVM在加载类的时候,都是通过ClassLoad ... -
minor Gc ,Full Gc
2014-12-24 17:22 2102在发生Minor gc之前,虚拟机会先检查老年带最 ... -
Java的主要垃圾回收器
2014-12-24 16:33 1307对象 ... -
JVM的内存结构的一点理解
2014-12-24 11:30 776... -
利用生产者消费者模式实现串行的任务并行化
2014-12-22 17:48 1235试想,一个省有100个处理节点需要 ... -
利用生产者消费者模式实现串行的任务并行化
2014-12-22 17:48 0试想,一个省有100个处理节点需要 ... -
关于Linux的Ulimit参数
2014-12-22 12:13 1275JVM 64位平台与32位平台 ... -
一种表格数据比对的方法
2014-12-19 16:59 1047假设有连个库,一个是生产库,一个是备份库,在一个特 ...
相关推荐
javap 使用说明文档 javap 是 JDK 中的一个命令行工具,主要用于对给定的 class 文件进行反编译,了解 Java 编译器内部的工作机制,并提高程序执行的效率。下面是 javap 的使用说明。 1. javap 的基本用法 javap ...
### javap 使用详解 #### 一、概述 `javap` 是 Java 开发工具包 (JDK) 中的一个重要工具,主要用于反编译 `.class` 文件中的字节码。通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的...
在Windows命令行中使用Java和相关命令如javac(Java编译器)和javap(Java类文件反编译器)是Java开发者的基本技能。为了深入理解这些命令的使用方法,让我们逐步详细地讨论每一个命令的具体用法和相关知识点。 ...
Java 中 javap 命令的使用技巧 javap 命令是 JDK 自带的一个工具,它可以对代码反编译,也可以查看 Java 编译器生成的字节码,对代码的执行过程进行分析,了解 JVM 内部的工作。javap 命令可以将 class 文件反编译...
javap2p 技术内幕javap2p 技术内幕javap2p 技术内幕javap2p 技术内幕
javap使用不同的参数可以提供不同详细程度的信息输出。例如,使用-v参数可以输出更详尽的信息,包括类的版本、修饰符、接口等,而使用-c参数可以反编译代码。 通过学习和分析字节码文件,开发者可以更好地理解Java...
这款“javap写的完整记事本”是一个很好的学习资源,对于想要了解如何使用Java Swing构建桌面应用,尤其是涉及文本编辑功能的开发者来说,它可以提供宝贵的实践经验。通过阅读和分析源代码,你可以深入理解Java GUI...
此外,还学习了如何使用`javap`命令来查看字节码文件的具体内容,这对于理解Java程序在底层的运行机制非常重要。 以上就是关于Java运行原理及javap命令运行结果的相关知识点的详细介绍。希望对你有所帮助!
在这个话题中,我们将深入探讨如何使用`Javap`作为类分解器来解析和理解Java字节码。 首先,让我们了解`Javap`的基本用法。在命令行中,你可以通过以下格式调用`Javap`: ```bash javap [选项] 类名 ``` 其中,`...
标题“ndk开发实战javap签名篇”指向了一个针对使用NDK进行Android应用开发过程中的具体技术实践——使用javap命令来获取Java类的签名信息,并生成相应的C/C++头文件,这对于在C/C++代码中调用Java层的方法是必需的...
2. **javap工具的使用**:详细介绍如何使用`javap`命令,包括基础用法和`-verbose`等高级选项的含义与作用。 3. **JVM指令集**:讲解JVM指令集的主要指令,如ALOAD(加载本地变量)、ICONST(常量加载)、IRETURN...
例如,BitTorrent协议使用了块级校验和(如SHA1)确保数据完整性。 7. **NAT穿透**:由于许多P2P节点可能位于NAT(网络地址转换)之后,直接通信变得复杂。STUN(简单Traversal of UDP through NATs)、TURN...
JavaP7架构师课程
NULL 博文链接:https://bolinyang.iteye.com/blog/1830472
标题:"JavaP2P技术内幕 part4" 描述:"JavaP2P技术内幕太大不能上传,分5部分传递" 从标题和描述中,我们可以提炼出的关键知识点主要围绕JavaP2P技术,即Java对等网络(Peer-to-Peer Network)技术。在IT行业中,...
标题:"JavaP2P技术内幕 part3" 描述:"JavaP2P技术内幕太大不能上传,分5部分传递" 从标题和描述中,我们可以提炼出的关键知识点主要围绕JavaP2P技术,即Java对等网络(Peer-to-Peer Network)技术。P2P技术在...
总的来说,通过上述步骤,开发者可以在Eclipse中快速便捷地使用`javap`命令,深入理解Java代码在JVM中的运行方式,从而提升编程技能和解决问题的能力。对于Java开发者来说,掌握这一技巧是非常有益的。
在`javap-Tool-master`这个压缩包中,很可能包含了一个关于如何使用`javap`工具的示例项目或教程。通过研究这个项目,你可以深入理解`javap`的用法,并学会如何在实际开发中运用它来提升你的编程技能。对于Java...
要使用sbt-javap ,请将以下内容添加到project/plugins.sbt :addSbtPlugin( " org.spire-math " % " sbt-javap " % " 0.0.1 " )用法sbt-javap提供了一项新的SBT任务: javap 。 该命令使用一个类的全限定名,将该...
【标题】:“javap写的一个动态日历” 这个标题表明我们正在讨论一个使用Java编程语言编写的日历程序。`javap`在这里可能被误用,实际上`javap`是Java平台的标准工具,用于反汇编Java类文件,展示字节码和相关的元...