2010-12-07 3 views
3

Я хотел бы простой способ декомпилировать Java. Я хочу изучить преобразования и модификации, которые компилятор javac делает в моем коде. Что было бы хорошими продуктами, и что было бы хорошим/плохим из них.Как декомпилировать Java

+2

Много отправных точек? http://stackoverflow.com/search?q=decompiler+java – birryree 2010-12-07 16:00:27

+1

Компилятор ** никогда ** не модифицирует ваш код, он переводит ваш код в java-байтовый код (который хранится в файле `.class`). – 2010-12-07 16:00:37

ответ

5

Быстро и грязно, используйте javap, который поставляется с JDK.

javap -c test 
Compiled from "test.java" 
public class test extends java.lang.Object{ 
public test(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]) throws java.lang.Exception; 
    Code: 
    0: ldC#2; //String CR_ABC_DEF_GHI 
    2: astore_1 
    3: ldC#3; //String TYPE=Eligibility Only|CLIENT_ID=62|EMPLOYER_ID=0|LOCATION_ID=0|PLAN_ID=all|FREQUENCY=52|FILE=null|FILETYPE=C|PROCESSTOLAUNCH=10|PROCESSTOLAUNCHSTATUS=100|SCHEDULE_ID=29837d692f4c43e786f1097fab7c360c 
    5: astore_2 
    6: ldC#4; //String \| 
    8: astore_3 
    9: ldC#5; //String FILE_NAME_TEMPLATE 
    11: astore 4 
    13: ldC#6; //String FILE 
    15: astore 5 
    17: new #7; //class java/lang/StringBuilder 
    20: dup 
    21: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    24: aload_3 
    25: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    28: aload 4 
    30: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    33: ldC#10; //String = 
    35: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    38: ldC#11; //String [^ 
    40: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    43: aload_3 
    44: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    47: ldC#12; //String ]* 
    49: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    52: aload_3 
    53: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    56: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    59: astore 6 
    61: new #7; //class java/lang/StringBuilder 
    64: dup 
    65: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    68: aload_3 
    69: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    72: aload 5 
    74: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    77: ldC#10; //String = 
    79: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    82: ldC#11; //String [^ 
    84: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    87: aload_3 
    88: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    91: ldC#12; //String ]* 
    93: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    96: aload_3 
    97: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    100: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    103: astore 7 
    105: new #7; //class java/lang/StringBuilder 
    108: dup 
    109: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    112: aload_3 
    113: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    116: aload 4 
    118: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    121: ldC#10; //String = 
    123: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    126: aload_1 
    127: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    130: aload_3 
    131: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    134: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    137: astore 8 
    139: aload_2 
    140: aload 6 
    142: aload 8 
    144: invokevirtual #14; //Method java/lang/String.replaceAll:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 
    147: aload 7 
    149: aload 8 
    151: invokevirtual #14; //Method java/lang/String.replaceAll:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 
    154: astore 9 
    156: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream; 
    159: new #7; //class java/lang/StringBuilder 
    162: dup 
    163: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    166: ldC#16; //String before = 
    168: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    171: aload_2 
    172: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    175: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    178: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    181: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream; 
    184: new #7; //class java/lang/StringBuilder 
    187: dup 
    188: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    191: ldC#18; //String pattern1 = 
    193: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    196: aload 6 
    198: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    201: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    204: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    207: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream; 
    210: new #7; //class java/lang/StringBuilder 
    213: dup 
    214: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    217: ldC#19; //String pattern2 = 
    219: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    222: aload 7 
    224: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    227: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    230: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    233: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream; 
    236: new #7; //class java/lang/StringBuilder 
    239: dup 
    240: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    243: ldC#20; //String replace = 
    245: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    248: aload 8 
    250: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    253: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    256: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    259: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream; 
    262: new #7; //class java/lang/StringBuilder 
    265: dup 
    266: invokespecial #8; //Method java/lang/StringBuilder."<init>":()V 
    269: ldC#21; //String after = 
    271: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    274: aload 9 
    276: invokevirtual #9; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    279: invokevirtual #13; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    282: invokevirtual #17; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    285: return 

} 
0

Я использовал JAD и могу использовать для его полезности.

Так же, как и голова, хотя любой скомпилированный код, скорее всего, будет свободен от каких-либо комментариев, а если код запутан, то декомпиляция на самом деле не приведет вас ни к чему. Это все равно будет выглядеть как бред.

Смежные вопросы