понедельник, 5 апреля 2010 г.

Java Decompiler

Да, по названию поста будет понятно о чём речь :)
По старой традиции использовал для этих целей всегда JAD. Но он уже достаточно давно заброшен и не справляется с некоторыми фишками. Нашёл хорошую альтернативу, так прям и называется Java Decompiler. Работает как отдельное приложение, так и как плагин к эклипсу.
Больше всего не давали жить две штуки (исходники, которые мне нужны, были просто напичканы ими): ассерты и дженерики. Вот на составил небольшой демонстрационный примерчик:
Исходный текст:

  1. public class Example {  
  2.       
  3.     public class Doing<T extends Some> extends Base<T> {  
  4.         @Override  
  5.         public T doSomething(T param) {  
  6.             assert(param == null);  
  7.             return param;  
  8.         }  
  9.     }  
  10.   
  11.     public abstract class Base<T extends Some> {  
  12.         public abstract T doSomething(T param);  
  13.     }  
  14.   
  15.     public class Some {  
  16.         public Some doing() {  
  17.             return this;  
  18.         }  
  19.     }  
  20.       
  21. }  
То что выдал JAD:
  1. // Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.  
  2. // Jad home page: http://www.kpdus.com/jad.html  
  3. // Decompiler options: packimports(3)   
  4. // Source File Name:   Example.java  
  5.   
  6. public class Example {  
  7.     public abstract class Base {  
  8.   
  9.         public abstract Some doSomething(Some some);  
  10.   
  11.         final Example this$0;  
  12.   
  13.         public Base() {  
  14.             this$0 = Example.this;  
  15.             super();  
  16.         }  
  17.     }  
  18.   
  19.     public class Doing extends Base {  
  20.   
  21.         public Some doSomething(Some param) {  
  22.             if (!$assertionsDisabled && param != null)  
  23.                 throw new AssertionError();  
  24.             else  
  25.                 return param;  
  26.         }  
  27.   
  28.         final Example this$0;  
  29.         static final boolean $assertionsDisabled = !Example  
  30.                 .desiredAssertionStatus();  
  31.   
  32.         public Doing() {  
  33.             this$0 = Example.this;  
  34.             super();  
  35.         }  
  36.     }  
  37.   
  38.     public class Some {  
  39.   
  40.         public Some doing() {  
  41.             return this;  
  42.         }  
  43.   
  44.         final Example this$0;  
  45.   
  46.         public Some() {  
  47.             this$0 = Example.this;  
  48.             super();  
  49.         }  
  50.     }  
  51.   
  52.     public Example() {  
  53.     }  
  54. }  
И наш чемпион Java Decompiler:
  1. public class Example {  
  2.     public abstract class Base<T extends Example.Some> {  
  3.         public Base() {  
  4.         }  
  5.   
  6.         public abstract T doSomething(T paramT);  
  7.     }  
  8.   
  9.     public class Doing<T extends Example.Some> extends Example.Base<T> {  
  10.         public Doing() {  
  11.             super(Example.this);  
  12.         }  
  13.   
  14.         public T doSomething(T param) {  
  15.             assert (param == null);  
  16.             return param;  
  17.         }  
  18.     }  
  19.   
  20.     public class Some {  
  21.         public Some() {  
  22.         }  
  23.   
  24.         public Some doing() {  
  25.             return this;  
  26.         }  
  27.     }  
  28. }  
Разница заметна на лицо, комментарии излишни :)

Комментариев нет:

Отправить комментарий