2011-10-24 9 views
8

Tôi biết câu hỏi này đã được hỏi về thời gian rồi, nhưng tôi đặc biệt là sau một trình giải mã có thể xử lý enums một cách chính xác (vì jar tôi đang giải mã sử dụng enums nặng nề). Tôi đã thử nghiệm cả JAD và JD-GUI thì không.Trình giải mã Java hoạt động với Java 5 (xử lý enums trong số những thứ mới khác)

Ai đó có thể giới thiệu trình giải mã (lý tưởng là hoạt động trong Linux và có thể dễ dàng xử lý toàn bộ bình mà không yêu cầu tôi viết các kịch bản shell)?

EDIT: Cụ thể là tôi có vấn đề với cấu trúc như sau:

switch(myEnum) { 
case A: ... 
case B: ... 
} 

họ nhận được dịch ngược (cho cả JAD và JD-GUI) như một cái gì đó như:

switch ($SWITCH_TABLE$com$MyType()[myEnum.ordinal()]) { 
case 1: 
case 2: 
} 

nơi $SWITCH_TABLE$com$MyType() là một trong hai không khai báo hoàn toàn hoặc không biên dịch.

+0

bản sao có thể có của [Tôi có thể tìm trình giải mã Java ở đâu?] (Http://stackoverflow.com/questions/671394/where-can-i-find-a-java-decompiler) –

+1

Theo câu hỏi tôi đã liên kết trên http://java.decompiler.free.fr/ cung cấp tốt nhất cho Java 5. Nếu điều này không làm việc cho bạn, sau đó cho chúng tôi biết * làm thế nào * nó không giúp đỡ. –

+0

Tôi không biết về JD-GUI nhưng chúng tôi đang sử dụng JD-Eclipse trong đó sử dụng một phiên bản cũ hơn của JD-Core mà JD-GUI làm, và nó xử lý enums là tốt. – Thomas

Trả lời

2

Không thể dịch ngược một công tắc enum đúng cách. Java-classfile không biết về enum-Typ sau khi biên dịch, do đó trình giải mã của bạn không thể dịch ngược nó theo ý thích của bạn.

Loại Enums là tất cả các loại phụ của java.lang.Enum, mỗi hằng số enum có số thứ tự được sử dụng trong câu lệnh chuyển đổi. Trình biên dịch thực hiện chuyển đổi trên giá trị int đó, một công tắc trên một loại enum đơn giản là nói cú pháp-đường. Nếu bạn cố gắng bật một số điện thoại null-thì bạn sẽ nhận được một NPE.

+0

Phụ thuộc vào mức độ thông minh của trình dịch ngược. Nếu nó có thể tìm thấy tuyên bố của enum, sau đó nó sẽ có thể ánh xạ các số thứ tự trở lại tên. – Grzenio

+0

Nếu tôi dịch ngược phiên bản $ 1 một tập tin lớp chuyển đổi trên ENUM, tôi nhận được một danh sách tất cả các số thứ tự cùng với hằng số ENUM. Nó sẽ có thể dịch ngược nó - nó chỉ cần mã hóa. Thật không may có vẻ như JD-Java Decompiler là mã nguồn mở :-(và JAD quá già để có thể tăng tốc với mọi thứ khác mà không cần nỗ lực lớn. – mjaggard

2

Tôi nhận thấy rằng sản phẩm của một dự án nghiên cứu, CFR, xử lý Enums đặc biệt tốt. Tại thời điểm này JD-GUI và JAD không hoạt động tốt hơn khi câu hỏi của OP được đăng, trong khi phiên bản CFR 0.43 tạo ra nguồn chính xác, có thể biên dịch, ngay cả khi được cho ăn các lớp bị xáo trộn.