`
zhang.yang530
  • 浏览: 13398 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

javap的使用

    博客分类:
  • JAVA
 
阅读更多
avap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具。
[size=large; padding: 0px; margin: 0px;][size=medium; padding: 0px; margin: 0px;]javap - Java class文件分解器[/size][/size]
  分解class文件

摘要:
  javap [ options ] class. . .

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


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);   
      }   
 }  

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);   
}   

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();   
    public void init();   
    public void paint(java.awt.Graphics);   
}   
  
Method DocFooter()   
   0 aload_0   
   1 invokespecial #1    
   4 return  
  
Method void init()   
   0 aload_0   
   1 sipush 500  
   4 bipush 100  
   6 invokevirtual #2    
   9 aload_0   
  10 aload_0   
  11 ldc #3    
  13 invokevirtual #4    
  16 putfield #5    
  19 aload_0   
  20 aload_0   
  21 ldc #6    
  23 invokevirtual #4    
  26 putfield #7    
  29 return  
  
Method void paint(java.awt.Graphics)   
   0 aload_1   
   1 new #8    
   4 dup   
   5 invokespecial #9    
   8 aload_0   
   9 getfield #5    
  12 invokevirtual #10    
  15 ldc #11    
  17 invokevirtual #10    
  20 invokevirtual #12    
  23 bipush 100  
  25 bipush 15  
  27 invokevirtual #13    
  30 aload_1   
  31 aload_0   
  32 getfield #7    
  35 sipush 290  
  38 bipush 15  
  40 invokevirtual #13    
  43 return 

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);
}

Method DocFooter()
   0 aload_0
   1 invokespecial #1 
   4 return

Method void init()
   0 aload_0
   1 sipush 500
   4 bipush 100
   6 invokevirtual #2 
   9 aload_0
  10 aload_0
  11 ldc #3 
  13 invokevirtual #4 
  16 putfield #5 
  19 aload_0
  20 aload_0
  21 ldc #6 
  23 invokevirtual #4 
  26 putfield #7 
  29 return

Method void paint(java.awt.Graphics)
   0 aload_1
   1 new #8 
   4 dup
   5 invokespecial #9 
   8 aload_0
   9 getfield #5 
  12 invokevirtual #10 
  15 ldc #11 
  17 invokevirtual #10 
  20 invokevirtual #12 
  23 bipush 100
  25 bipush 15
  27 invokevirtual #13 
  30 aload_1
  31 aload_0
  32 getfield #7 
  35 sipush 290
  38 bipush 15
  40 invokevirtual #13 
  43 return

当然,如果想分析这个文件,可以讲输出结果输出到一个文件里。可以这样写
javap -c DocFooter > F://test.txt
这样就会输出到F盘的test.txt文件中了。
选项:
   -help 不说了
   -l 输出行和变量的表
   -public 只输出public方法和域
   -protected 只输出public和protected类和成员
   -package 只输出包,public和protected类和成员,这是默认的
   -private  输出所有类和成员
   -s 输出内部类型签名
   -c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,
   -verbose 输出栈大小,方法参数的个数
   。。。
分享到:
评论

相关推荐

    javap使用说明文档

    javap 使用说明文档 javap 是 JDK 中的一个命令行工具,主要用于对给定的 class 文件进行反编译,了解 Java 编译器内部的工作机制,并提高程序执行的效率。下面是 javap 的使用说明。 1. javap 的基本用法 javap ...

    javap使用(1).docx

    ### javap 使用详解 #### 一、概述 `javap` 是 Java 开发工具包 (JDK) 中的一个重要工具,主要用于反编译 `.class` 文件中的字节码。通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的...

    windows命令行中java和javac、javap使用详解(java编译命令)

    在Windows命令行中使用Java和相关命令如javac(Java编译器)和javap(Java类文件反编译器)是Java开发者的基本技能。为了深入理解这些命令的使用方法,让我们逐步详细地讨论每一个命令的具体用法和相关知识点。 ...

    javap2p技术内幕.part2.rar

    javap2p 技术内幕javap2p 技术内幕javap2p 技术内幕javap2p 技术内幕

    JVM 字节码从入门到精通

    javap使用不同的参数可以提供不同详细程度的信息输出。例如,使用-v参数可以输出更详尽的信息,包括类的版本、修饰符、接口等,而使用-c参数可以反编译代码。 通过学习和分析字节码文件,开发者可以更好地理解Java...

    javap写的完整记事本

    这款“javap写的完整记事本”是一个很好的学习资源,对于想要了解如何使用Java Swing构建桌面应用,尤其是涉及文本编辑功能的开发者来说,它可以提供宝贵的实践经验。通过阅读和分析源代码,你可以深入理解Java GUI...

    Java运行原理 javap命令运行结果

    此外,还学习了如何使用`javap`命令来查看字节码文件的具体内容,这对于理解Java程序在底层的运行机制非常重要。 以上就是关于Java运行原理及javap命令运行结果的相关知识点的详细介绍。希望对你有所帮助!

    javap命令的使用技巧

    Java 中 javap 命令的使用技巧 javap 命令是 JDK 自带的一个工具,它可以对代码反编译,也可以查看 Java 编译器生成的字节码,对代码的执行过程进行分析,了解 JVM 内部的工作。javap 命令可以将 class 文件反编译...

    使用类分解器Javap分析Java字节码

    在这个话题中,我们将深入探讨如何使用`Javap`作为类分解器来解析和理解Java字节码。 首先,让我们了解`Javap`的基本用法。在命令行中,你可以通过以下格式调用`Javap`: ```bash javap [选项] 类名 ``` 其中,`...

    ndk开发实战javap签名篇

    标题“ndk开发实战javap签名篇”指向了一个针对使用NDK进行Android应用开发过程中的具体技术实践——使用javap命令来获取Java类的签名信息,并生成相应的C/C++头文件,这对于在C/C++代码中调用Java层的方法是必需的...

    HelloWorld的javap -verbose HelloWorld 字节码初探

    2. **javap工具的使用**:详细介绍如何使用`javap`命令,包括基础用法和`-verbose`等高级选项的含义与作用。 3. **JVM指令集**:讲解JVM指令集的主要指令,如ALOAD(加载本地变量)、ICONST(常量加载)、IRETURN...

    javaP2P总结

    例如,BitTorrent协议使用了块级校验和(如SHA1)确保数据完整性。 7. **NAT穿透**:由于许多P2P节点可能位于NAT(网络地址转换)之后,直接通信变得复杂。STUN(简单Traversal of UDP through NATs)、TURN...

    JavaP7架构师课程 JavaP7架构师课程

    JavaP7架构师课程

    Java的class文件结构介绍以及如何实现javap

    NULL 博文链接:https://bolinyang.iteye.com/blog/1830472

    JavaP2P技术内幕 part4

    标题:"JavaP2P技术内幕 part4" 描述:"JavaP2P技术内幕太大不能上传,分5部分传递" 从标题和描述中,我们可以提炼出的关键知识点主要围绕JavaP2P技术,即Java对等网络(Peer-to-Peer Network)技术。在IT行业中,...

    JavaP2P技术内幕 part3

    标题:"JavaP2P技术内幕 part3" 描述:"JavaP2P技术内幕太大不能上传,分5部分传递" 从标题和描述中,我们可以提炼出的关键知识点主要围绕JavaP2P技术,即Java对等网络(Peer-to-Peer Network)技术。P2P技术在...

    eclipse配置javap命令的方法

    总的来说,通过上述步骤,开发者可以在Eclipse中快速便捷地使用`javap`命令,深入理解Java代码在JVM中的运行方式,从而提升编程技能和解决问题的能力。对于Java开发者来说,掌握这一技巧是非常有益的。

    javap-Tool:JAVA项目

    在`javap-Tool-master`这个压缩包中,很可能包含了一个关于如何使用`javap`工具的示例项目或教程。通过研究这个项目,你可以深入理解`javap`的用法,并学会如何在实际开发中运用它来提升你的编程技能。对于Java...

    sbt-javap:直接从SBT控制台运行Javap

    要使用sbt-javap ,请将以下内容添加到project/plugins.sbt :addSbtPlugin( " org.spire-math " % " sbt-javap " % " 0.0.1 " )用法sbt-javap提供了一项新的SBT任务: javap 。 该命令使用一个类的全限定名,将该...

    javap写的一个动态日历

    【标题】:“javap写的一个动态日历” 这个标题表明我们正在讨论一个使用Java编程语言编写的日历程序。`javap`在这里可能被误用,实际上`javap`是Java平台的标准工具,用于反汇编Java类文件,展示字节码和相关的元...

Global site tag (gtag.js) - Google Analytics