zoukankan      html  css  js  c++  java
  • javap——查看class文件的方法

    有时候为了研究Javac的原理,要去看看class文件的内容是如何组织的,这时候很有必要查看class文件。方法有很多种,这里推荐使用JDK自带的javap工具。 
    首先建立如下源码:

    public class HelloWorld{
        public static void main(String[] args){
            System.out.println("hello world!");
        }
    }

    使用javac编译器把源文件编译好,再接着使用javap工具查看class文件,命令如下 
    javap -verbose HelloWorld

    这是DOS窗口的运行结果复制出来如下图:

    F:>javac HelloWorld.java
    
    F:>javap -verbose HelloWorld
    Classfile /F:/HelloWorld.class
      Last modified 2017-12-24; size 426 bytes
      MD5 checksum 4efac412ef483c8a3fe7489c87d15c8c
      Compiled from "HelloWorld.java"
    public class HelloWorld
      minor version: 0
      major version: 52
      flags: ACC_PUBLIC, ACC_SUPER
    Constant pool:
       #1 = Methodref          #6.#15         // java/lang/Object."<init>":()V
       #2 = Fieldref           #16.#17        // java/lang/System.out:Ljava/io/Print
    Stream;
       #3 = String             #18            // hello world!
       #4 = Methodref          #19.#20        // java/io/PrintStream.println:(Ljava/
    lang/String;)V
       #5 = Class              #21            // HelloWorld
       #6 = Class              #22            // java/lang/Object
       #7 = Utf8               <init>
       #8 = Utf8               ()V
       #9 = Utf8               Code
      #10 = Utf8               LineNumberTable
      #11 = Utf8               main
      #12 = Utf8               ([Ljava/lang/String;)V
      #13 = Utf8               SourceFile
      #14 = Utf8               HelloWorld.java
      #15 = NameAndType        #7:#8          // "<init>":()V
      #16 = Class              #23            // java/lang/System
      #17 = NameAndType        #24:#25        // out:Ljava/io/PrintStream;
      #18 = Utf8               hello world!
      #19 = Class              #26            // java/io/PrintStream
      #20 = NameAndType        #27:#28        // println:(Ljava/lang/String;)V
      #21 = Utf8               HelloWorld
      #22 = Utf8               java/lang/Object
      #23 = Utf8               java/lang/System
      #24 = Utf8               out
      #25 = Utf8               Ljava/io/PrintStream;
      #26 = Utf8               java/io/PrintStream
      #27 = Utf8               println
      #28 = Utf8               (Ljava/lang/String;)V
    {
      public HelloWorld();
        descriptor: ()V
        flags: ACC_PUBLIC
        Code:
          stack=1, locals=1, args_size=1
             0: aload_0
             1: invokespecial #1                  // Method java/lang/Object."<init>
    ":()V
             4: return
          LineNumberTable:
            line 1: 0
    
      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     #2                  // Field java/lang/System.out:Ljav
    a/io/PrintStream;
             3: ldc           #3                  // String hello world!
             5: invokevirtual #4                  // Method java/io/PrintStream.prin
    tln:(Ljava/lang/String;)V
             8: return
          LineNumberTable:
            line 3: 0
            line 4: 8
    }
    SourceFile: "HelloWorld.java"
    
    F:>

    这样就是JVM规范的class文件了。结合这个对比源码可以深刻的认识到Javac的作用所在。

  • 相关阅读:
    el-select下拉框选项太多导致卡顿,使用下拉框分页来解决
    vue+elementui前端添加数字千位分割
    Failed to check/redeclare auto-delete queue(s)
    周末啦,做几道面试题放松放松吧!
    idea快捷键
    解决flink运行过程中报错Could not allocate enough slots within timeout of 300000 ms to run the job. Please make sure that the cluster has enough resources.
    用.net平台实现websocket server
    MQTT实战3
    Oracle 查看当前用户下库里所有的表、存储过程、触发器、视图
    idea从svn拉取项目不识别svn
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/9144213.html
Copyright © 2011-2022 走看看