2010-12-07 6 views
3

Java를 디 컴파일하는 간단한 방법을 원합니다. javac 컴파일러가 내 코드에서 수행하는 변환과 수정을 검사하고 싶습니다. 어떤 좋은 제품이 될 것이며 그 제품의 좋고 나쁨은 무엇이겠습니까?Java 디 컴파일 방법

+2

시작 지점이 많습니까? http://stackoverflow.com/search?q=decompiler+java – birryree

+1

컴파일러 **는 ** 귀하의 코드를 수정하지 않으며, 귀하의 코드를 자바 바이트 코드 ('.class' 파일에 저장 됨)로 변환합니다. –

+2

컴파일러가 최적화를 거의하지 않으며 JVM이 런타임에 수행 할 작업에 대해 많은 정보를주지 않는다는 점에 유의하십시오. JVM에서는 모든 중요한 최적화가 이루어집니다. –

답변

5

JDK와 함께 제공되는 javap을 빠르고 간편하게 사용하십시오.

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 

} 
+1

이것은 컴파일러가 무엇을하는지 더 잘 이해할 수있게 해줍니다. 디 컴파일러는이를 다시 합리적인 코드로 바꾸어서 세부 사항을 숨길 수 있습니다. –

1

나는 발견했다 this tool 꽤 좋습니다.

0

나는 JAD를 사용해 왔으며 유용성을 느낄 수 있습니다.

비록 컴파일 된 코드가 주석이 없을 가능성이 높습니다. 코드가 난독 화되면 디 컴파일이 실제로 어디에도 나타나지 않습니다. 그것은 여전히 ​​변태처럼 보일 것입니다.

관련 문제