一个普通的Java类:

  1. package org.ccnt.concurrence;
  2.  
  3. public class VolatileTest {
  4.  
  5. public static volatile int race = 0;
  6.  
  7. public static void increate() {
  8. race ++;
  9. }
  10.  
  11. private static final int THREAD_COUNT = 20;
  12.  
  13. public static void main(String[] args) {
  14. Thread[] threads = new Thread[THREAD_COUNT];
  15. for (int i=0; i<THREAD_COUNT; i++) {
  16. threads[i] = new Thread(new Runnable() {
  17.  
  18. @Override
  19. public void run() {
  20. for (int i=0; i<10000; i++){
  21. increate();
  22. }
  23. }
  24. });
  25. threads[i].start();
  26. }
  27.  
  28. while (Thread.activeCount() > 1) {
  29. Thread.yield();
  30. }
  31.  
  32. System.out.println(race);
  33. }
  34. }

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

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

VolatieTest.jad

  1. Compiled from "VolatileTest.java"
  2. public class org.ccnt.concurrence.VolatileTest {
  3. public static volatile int race;
  4. static {};
  5. public org.ccnt.concurrence.VolatileTest();
  6. public static void increate();
  7. public static void main(java.lang.String[]);
  8. }

查看字节码:

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

VolatileTest.txt

  1. Compiled from "VolatileTest.java"
  2. public class org.ccnt.concurrence.VolatileTest {
  3. public static volatile int race;
  4.  
  5. static {};
  6. Code:
  7. 0: iconst_0
  8. 1: putstatic #13 // Field race:I
  9. 4: return
  10.  
  11. public org.ccnt.concurrence.VolatileTest();
  12. Code:
  13. 0: aload_0
  14. 1: invokespecial #18 // Method java/lang/Object."<init>":()V
  15. 4: return
  16.  
  17. public static void increate();
  18. Code:
  19. 0: getstatic #13 // Field race:I
  20. 3: iconst_1
  21. 4: iadd
  22. 5: putstatic #13 // Field race:I
  23. 8: return
  24.  
  25. public static void main(java.lang.String[]);
  26. Code:
  27. 0: bipush 20
  28. 2: anewarray #25 // class java/lang/Thread
  29. 5: astore_1
  30. 6: iconst_0
  31. 7: istore_2
  32. 8: goto 37
  33. 11: aload_1
  34. 12: iload_2
  35. 13: new #25 // class java/lang/Thread
  36. 16: dup
  37. 17: new #27 // class org/ccnt/concurrence/VolatileTest$1
  38. 20: dup
  39. 21: invokespecial #29 // Method org/ccnt/concurrence/VolatileTest$1."<init>":()V
  40. 24: invokespecial #30 // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
  41. 27: aastore
  42. 28: aload_1
  43. 29: iload_2
  44. 30: aaload
  45. 31: invokevirtual #33 // Method java/lang/Thread.start:()V
  46. 34: iinc 2, 1
  47. 37: iload_2
  48. 38: bipush 20
  49. 40: if_icmplt 11
  50. 43: goto 49
  51. 46: invokestatic #36 // Method java/lang/Thread.yield:()V
  52. 49: invokestatic #39 // Method java/lang/Thread.activeCount:()I
  53. 52: iconst_1
  54. 53: if_icmpgt 46
  55. 56: getstatic #43 // Field java/lang/System.out:Ljava/io/PrintStream;
  56. 59: getstatic #13 // Field race:I
  57. 62: invokevirtual #49 // Method java/io/PrintStream.println:(I)V
  58. 65: return
  59. }

使用javap反编译class文件的更多相关文章

  1. 反编译APK文件

    有时源代码丢失了,这时如果有apk文件的话,是可以对apk文件反编译得到源文件的,本文介绍一下简单的反编译apk文件的过程. 1.工具 反编译apk需要的工具有两个:apk2java和apktool, ...

  2. MyEclipse反编译Class文件

    对于需要查看Java Class文件源码的筒子们来说,必须在项目中导入Java源码才能查看Class文件的具体实现,这不仅十分的麻烦,因为有时我们并不可以获得Class文件对应的Java源码.今天就给 ...

  3. Xamarin android如何反编译apk文件

    Xamarin android 如何反编译 apk文件 这里推荐一款XamarinAndroid开发的小游戏,撸棍英雄,游戏很简单,的确的是有点大.等一下我们来翻翻译这个Xamarin Android ...

  4. 反编译class文件并重新编译的方法

    在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...

  5. Eclipse Oxygen(4.7.0)安装插件Eclipse Class Decompiler反编译JAR文件

    引用自官方内容 Eclipse Class Decompiler是一款Eclipse插件,整合了多种反编译器,和Eclipse Class Viewer无缝集成,能够很方便的使用插件查看类库源码,进行 ...

  6. Android开发学习之反编译APK文件

    反编译的目的在于学习一些优秀的Android应用程序代码. 在进行反编译之前,需要准备好下面的软件工具(这些文件都放在同一文件下): 这些工具的下载地址:http://down.51cto.com/d ...

  7. 简单的反编译class文件并重新编译的方法

    在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...

  8. Android apktool反编译资源文件为空解决办法(测试天猫、淘宝等apk成功)

    1 Exception in thread main brut.androlib.androlibexception multiple resources 解决办法:下载最新的apktool,在goo ...

  9. Eclipse - 安装了jd-eclipse插件后依然无法反编译类文件

    问题 Eclipse在安装了jd-eclipse插件后依然无法反编译类文件,这个问题是因为没有修改默认的类文件查看器. 解决方法 修改默认的类文件查看器为jd-eclipse Window -> ...

随机推荐

  1. #define与运算精度问题探究

    #include <stdio.h> #define SQR(X) X*X int main(int argc, char* argv[]) { ; ; ; printf("SQ ...

  2. 第十章:鸟哥的Linux私房菜

    第十章.vim程式编辑器 1. vi与vim 1.1 为何要学vim2. vi的使用 2.1 简易执行范例 2.2 按键说明 2.3 一个案例的练习 2.4 vim的暂存档.救援回复与开启时的警告讯息 ...

  3. 1763 An Essay towards solving a Problem in the Doctrine of Chances

    https://en.wikipedia.org/wiki/An_Essay_towards_solving_a_Problem_in_the_Doctrine_of_Chances

  4. php数据缓存

    用php进行微信开发时,碰到access_token长久保存的问题,以前都是用框架里的Cache直接set.get一下就完了.现在没框架可用了,只好自己动手写一个cache暂时用. 这个Cache类用 ...

  5. 设计模式:命令模式(Command)

    定   义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排列或者记录请求日志,以及支持可撤销的操作. 结构图: Command类: abstract class Comma ...

  6. ios证书

    内容提要: 安装app时提示 “无法下载应用,此时无法安装“XXX””.我遇到过多次是由于ios的app出现证书问题.本篇文章讲解用ios证书制作过程,以及每个步骤的解释. 正文: Xcode签名至少 ...

  7. Java学习-032-JavaWeb_001 -- Tomcat环境部署及基本配置

    首先到 Tomcat 官网,下载对应的版本,我本机的系统是 WIN7 64BIT 的,因而我选择的是64bit 的zip包,如下图所示:

  8. Selenium2学习-009-WebUI自动化实战实例-007-Selenium 8种元素定位实战实例源代码(百度首页搜索录入框及登录链接)

    此 文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,通过 ID.name.xpath.cssSelector.linkText.className.partialLinkTe ...

  9. [转]获得 LayoutInflater 实例的三种方式

    转自:http://www.cnblogs.com/androidez/archive/2013/07/01/3164729.html 获得 LayoutInflater 实例的三种方式   在实际开 ...

  10. http://blog.csdn.net/maosidiaoxian/article/details/40109337

    http://blog.csdn.net/maosidiaoxian/article/details/40109337