zoukankan      html  css  js  c++  java
  • 使用javap反编译class文件

    一个普通的Java类:

    package org.ccnt.concurrence;
    
    public class VolatileTest {
    
        public static volatile int race = 0;
        
        public static void increate() {
            race ++;
        }
        
        private static final int THREAD_COUNT = 20;
        
        public static void main(String[] args) {
            Thread[] threads = new Thread[THREAD_COUNT];
            for (int i=0; i<THREAD_COUNT; i++) {
                threads[i] = new Thread(new Runnable() {
                    
                    @Override
                    public void run() {
                        for (int i=0; i<10000; i++){
                            increate();
                        }
                    }
                });
                threads[i].start();
            }
            
            while (Thread.activeCount() > 1) {
                Thread.yield();
            }
            
            System.out.println(race);
        }
    }

    现在我们使用JDK带的反编译工具javap来反编译VilatileTest.class,先执行下面的命令:

    javap org.ccnt.concurrence.VolatileTest > VolatileTest.jad

    VolatieTest.jad

    Compiled from "VolatileTest.java"
    public class org.ccnt.concurrence.VolatileTest {
      public static volatile int race;
      static {};
      public org.ccnt.concurrence.VolatileTest();
      public static void increate();
      public static void main(java.lang.String[]);
    }

    查看字节码:

    javap -c org.ccnt.concurrence.VolatileTest > VolatileTest.txt

    VolatileTest.txt

    Compiled from "VolatileTest.java"
    public class org.ccnt.concurrence.VolatileTest {
      public static volatile int race;
    
      static {};
        Code:
           0: iconst_0      
           1: putstatic     #13                 // Field race:I
           4: return        
    
      public org.ccnt.concurrence.VolatileTest();
        Code:
           0: aload_0       
           1: invokespecial #18                 // Method java/lang/Object."<init>":()V
           4: return        
    
      public static void increate();
        Code:
           0: getstatic     #13                 // Field race:I
           3: iconst_1      
           4: iadd          
           5: putstatic     #13                 // Field race:I
           8: return        
    
      public static void main(java.lang.String[]);
        Code:
           0: bipush        20
           2: anewarray     #25                 // class java/lang/Thread
           5: astore_1      
           6: iconst_0      
           7: istore_2      
           8: goto          37
          11: aload_1       
          12: iload_2       
          13: new           #25                 // class java/lang/Thread
          16: dup           
          17: new           #27                 // class org/ccnt/concurrence/VolatileTest$1
          20: dup           
          21: invokespecial #29                 // Method org/ccnt/concurrence/VolatileTest$1."<init>":()V
          24: invokespecial #30                 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
          27: aastore       
          28: aload_1       
          29: iload_2       
          30: aaload        
          31: invokevirtual #33                 // Method java/lang/Thread.start:()V
          34: iinc          2, 1
          37: iload_2       
          38: bipush        20
          40: if_icmplt     11
          43: goto          49
          46: invokestatic  #36                 // Method java/lang/Thread.yield:()V
          49: invokestatic  #39                 // Method java/lang/Thread.activeCount:()I
          52: iconst_1      
          53: if_icmpgt     46
          56: getstatic     #43                 // Field java/lang/System.out:Ljava/io/PrintStream;
          59: getstatic     #13                 // Field race:I
          62: invokevirtual #49                 // Method java/io/PrintStream.println:(I)V
          65: return        
    }
  • 相关阅读:
    JS—图片压缩上传(单张)
    vue 使用jssdk分享
    微信JS-SDK选择图片遇到的坑
    手把手教你实现一个微信自动回复机器人
    SSH实现远程控制
    使用Apache服务部署静态网站
    Rhel7安装及网卡、yum、vmtools配置和修改主机名
    基础工具之消息队列、线程池、缓冲区抽象、事件循环和日志实现
    I/O多路复用方案
    Java按字节截取字符串(GBK编码、UTF-8编码实现)
  • 原文地址:https://www.cnblogs.com/549294286/p/3517736.html
Copyright © 2011-2022 走看看