一个普通的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
}

使用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. select * 所有字段时如何巧妙的使用覆盖索引

    内容从"mysql高性能书籍"  179页摘取 当select * 时.往往使用不到索引..效率不高,因为查询从表中选择所有的列,没有任何索引能覆盖所有的列.不过还是有捷径可以利用 ...

  2. PHP笔记——java程序员看懂PHP程序

    PHP笔记——java程序员看懂PHP程序   php是一种服务器端脚本语言,类型松散的语言. <?php   ?>       xml风格 <script language=”ph ...

  3. CentOS_6.5安装Nginx+PHP+MySQL

    #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # Ch ...

  4. React.js model

    // tutorial1.js var CommentBox = React.createClass({ render: function() { return ( <div className ...

  5. 在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程

    http://jijiaa12345.iteye.com/blog/1739754 在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程 本文是一篇在Myeclipse下构建Jav ...

  6. 使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码

    正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.u ...

  7. iOS简单排序--字母排序、NSDictionary排序

    // 数组用系统方法compare做字母的简单排序 NSArray *oldArray = @[@"bac",@"bzd",@"azc",@ ...

  8. 获得sql对应的binary

    Declare @max Varbinary(max) select @Max = convert(Varbinary(max) , ' Select ' ) Print ' DECLARE @sql ...

  9. TCP的三次握手四次挥手

    一.三次握手 1.wireshark 抓包 2.TCP报文手部 注意标志位: 1).同步 SYN = 1 表示这是一个连接请求或连接接受报文. 2).只有当 ACK = 1 时确认号字段才有效.当 A ...

  10. ArcGIS中的坐标系定义与转换 (转载)

    原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...