使用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
}
使用javap反编译class文件的更多相关文章
- 反编译APK文件
有时源代码丢失了,这时如果有apk文件的话,是可以对apk文件反编译得到源文件的,本文介绍一下简单的反编译apk文件的过程. 1.工具 反编译apk需要的工具有两个:apk2java和apktool, ...
- MyEclipse反编译Class文件
对于需要查看Java Class文件源码的筒子们来说,必须在项目中导入Java源码才能查看Class文件的具体实现,这不仅十分的麻烦,因为有时我们并不可以获得Class文件对应的Java源码.今天就给 ...
- Xamarin android如何反编译apk文件
Xamarin android 如何反编译 apk文件 这里推荐一款XamarinAndroid开发的小游戏,撸棍英雄,游戏很简单,的确的是有点大.等一下我们来翻翻译这个Xamarin Android ...
- 反编译class文件并重新编译的方法
在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...
- Eclipse Oxygen(4.7.0)安装插件Eclipse Class Decompiler反编译JAR文件
引用自官方内容 Eclipse Class Decompiler是一款Eclipse插件,整合了多种反编译器,和Eclipse Class Viewer无缝集成,能够很方便的使用插件查看类库源码,进行 ...
- Android开发学习之反编译APK文件
反编译的目的在于学习一些优秀的Android应用程序代码. 在进行反编译之前,需要准备好下面的软件工具(这些文件都放在同一文件下): 这些工具的下载地址:http://down.51cto.com/d ...
- 简单的反编译class文件并重新编译的方法
在没有.java源码的情况下,如果想修改一个.class文件.可以通过以下步骤实现: 修改前的class文件: 一.反编译.class文件成.java文件. 1.可以使用Java Decompiler ...
- Android apktool反编译资源文件为空解决办法(测试天猫、淘宝等apk成功)
1 Exception in thread main brut.androlib.androlibexception multiple resources 解决办法:下载最新的apktool,在goo ...
- Eclipse - 安装了jd-eclipse插件后依然无法反编译类文件
问题 Eclipse在安装了jd-eclipse插件后依然无法反编译类文件,这个问题是因为没有修改默认的类文件查看器. 解决方法 修改默认的类文件查看器为jd-eclipse Window -> ...
随机推荐
- PROTEL99SE封装说明
PROTEL99SE封装说明 路板上的焊盘间的距离也就是300mil(因为在电机领域里,是以英制单位为主的.同样的, 对于无极性的电容,RAD0.1-RAD0.4 也是一样:对有极性的电容如电解电容 ...
- PHP基本使用
本篇说的基本使用包括: php常规的语法 date,number,array等对象的处理方式 程序语言的常规的语法都比较好理解,大致相同.假如你是精于其它解释型语言的程序员,迁移到php几乎不费力气. ...
- jquery 选择器,模糊匹配
按姓名匹配 1,name前缀为aa的所有div的jquery对象 $("div[name^='aa']"); 2,name后缀为aa的所有div的jquery对象 $(" ...
- link them together by means of pointers
Computer Science An Overview _J. Glenn Brookshear _11th Edition An alternative to storing a heteroge ...
- P1970 花匠
状态定义是dp中非常重要的,可以直接影响到效率,如此题,第一种思路是: #include <bits/stdc++.h> using namespace std; const int ma ...
- MySQL安装图解教程
安装文件存放路径:不能有中文和空格! 校验 1 安装MySQL 2 校验MySQL 登录MySQL:mysql -uroot -p123 退出MySQL:exit | quit 查看数据库:show ...
- Delphi XE5 与其他版本共存
来源于http://www.board4allcz.eu 作者是gateway 如果你想使用Delphi诸如XE4.XE3.XE2.XE之类的版本跟Delphi XE5共存的话,在cglm.ini中简 ...
- pro10
1.本次课学习到的知识点: 什么是数组?为什么要使用数组?如何定义数组? 如何引用数组元素? 2. 实验过程中遇到的问题及解决方法: 在最后一个试验中,在输出最大小标那里进行了仔细的思考,刚开始思考应 ...
- angularJS平行控制器间共享数据
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- ubuntu下hadoop环境配置
软件环境: 虚拟机:VMware Workstation 10 操作系统:ubuntu-12.04-desktop-amd64 JAVA版本:jdk-7u55-linux-x64 Hadoop版本:h ...