Làm cách nào để mở các tệp .class Java theo cách mà con người có thể đọc được?


111

Tôi đang cố gắng tìm ra tệp lớp của ứng dụng Java đang hoạt động gì. Mở nó bằng Notepad hoặc Textpad chỉ hiển thị một loạt các trò chơi ngớ ngẩn.

Có cách nào để cuộn nó lại thành một định dạng dễ đọc để tôi có thể thử tìm hiểu xem nó đang làm gì không?

  • Môi trường == Đã cài đặt Windows w / VS 2008.

7
Chỉ là một thứ ngữ nghĩa, không phải là một = không phải hai? == là một câu hỏi while = là một câu lệnh và bạn đang đưa ra một tuyên bố về môi trường của bạn.
icco 16-08

Bạn có thể làm rõ câu hỏi này? Suy nghĩ ngay lập tức của tôi là bạn muốn đọc mã bytecode thực sự, nhưng có vẻ như bạn thực sự muốn dịch ngược mã của người khác.
Lập trình viên ngoài vòng pháp luật,

12
@icco, = nghĩa là gán, == nghĩa là bình đẳng. Anh ta đang nói rằng (Môi trường == Windows w / VS2008 được cài đặt) là đúng, không đưa ra lệnh đặt Môi trường thành Windows w / VS2008 được cài đặt. Người đàn ông dị tật và mọt sách.
Blorgbeard ra mắt

7
Đối với bản ghi == không tuyên bố bình đẳng; nó kiểm tra sự bình đẳng. Bạn có thể viết true == false, và nó có ý nghĩa như cách viết Môi trường == Windows w / VS 2008 được cài đặt, tức là không có ý nghĩa gì cả.
bwerks

Câu trả lời:


208

jd-gui là trình dịch ngược tốt nhất ở thời điểm hiện tại. nó có thể xử lý các tính năng mới hơn trong Java, so với JAD bụi bặm.


1
Câu trả lời này cập nhật như thế nào vào năm 2020?
The Coding Wombat

Miễn là liên kết đi đâu đó, tôi cho là nó tốt. Tôi không biết bây giờ có một trình dịch ngược Java tốt hơn hay không, vì tôi đã không sử dụng Java từ lâu rồi.
DarenW

77

Nếu bạn không phiền khi đọc bytecode, javap sẽ hoạt động tốt. Đó là một phần của cài đặt JDK tiêu chuẩn.

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure

9

Như đã chỉ ra bởi @MichaelMyers, hãy sử dụng

javap -c <name of java class file> 

để lấy mã lắp ráp JVM. Bạn cũng có thể chuyển hướng đầu ra thành tệp văn bản để hiển thị tốt hơn.

javap -c <name of java class file> > decompiled.txt

7

Bạn muốn có một trình dịch ngược java, bạn có thể sử dụng công cụ dòng lệnh javapđể thực hiện việc này. Ngoài ra, Java Decompiler HOW-TO mô tả cách bạn có thể dịch ngược một tệp lớp.


2

những gì bạn đang tìm kiếm là một trình biên dịch java. Tôi khuyên bạn nên sử dụng JAD http://www.kpdus.com/jad.html Nó miễn phí cho mục đích thương mại và hoàn thành công việc.

Lưu ý: điều này sẽ không làm cho mã chính xác giống như những gì đã được viết. tức là bạn sẽ mất nhận xét và có thể là tên biến, vì vậy sẽ khó hơn một chút so với việc chỉ đọc mã nguồn bình thường. Nếu nhà phát triển thực sự bí mật, họ cũng sẽ làm xáo trộn mã của họ, khiến nó thậm chí còn khó đọc hơn.


2

cpuguru, nếu applet của bạn đã được biên dịch với javac 1.3 (hoặc ít hơn), lựa chọn tốt nhất của bạn là sử dụng Jad.

Thật không may, JDK cuối cùng được hỗ trợ bởi JAD 1.5.8 (ngày 14 tháng 4 năm 2001) là JDK 1.3.

Nếu applet của bạn đã được biên dịch bằng trình biên dịch mới hơn, bạn có thể thử JD-GUI : trình dịch ngược này đang được phát triển, tuy nhiên, nó tạo nguồn Java chính xác, hầu hết thời gian, cho các lớp được biên dịch bằng JDKs 1.4, 1.5 hoặc 1.6.

DarenW, cảm ơn bạn cho bài viết của bạn. JD-GUI chưa phải là trình dịch ngược tốt nhất ... nhưng tôi đang làm việc trên :)



2

Sử dụng Jad để dịch ngược nó có lẽ là lựa chọn tốt nhất của bạn. Trừ khi mã đã bị xáo trộn, nó sẽ tạo ra một kết quả ổn.



1

Bạn cần sử dụng một trình dịch ngược. Những người khác đã đề xuất JAD, có những lựa chọn khác, JAD là tốt nhất.

Tôi sẽ lặp lại những nhận xét mà bạn có thể mất một chút so với mã nguồn ban đầu. Nó sẽ trông đặc biệt buồn cười nếu mã sử dụng generic, do bị tẩy xóa.



1

Nếu tệp lớp bạn muốn xem là mã nguồn mở, bạn không nên dịch ngược nó mà thay vào đó đính kèm các tệp nguồn trực tiếp vào IDE của bạn. theo cách đó, bạn chỉ có thể xem mã của một số lớp thư viện như thể nó là của riêng bạn


0

Theo gợi ý, bạn có thể sử dụng JAD để dịch ngược nó và xem các tệp. Để dễ đọc hơn, bạn có thể sử dụng plugin JADclipse cho eclipse để tích hợp JAD trực tiếp vào eclipse hoặc sử dụng Trình biên dịch DJ Java dễ sử dụng hơn nhiều so với dòng lệnh JAD


0

JAD là một lựa chọn tuyệt vời nếu bạn muốn mã Java có thể đọc được. Tuy nhiên, nếu bạn thực sự muốn tìm hiểu nội dung bên trong của .classđịnh dạng tệp, bạn sẽ muốn javap. Nó được đóng gói với JDK và cho phép bạn "dịch ngược" mã byte thập lục phân thành ASCII có thể đọc được. Ngôn ngữ mà nó tạo ra vẫn là bytecode (không phải bất cứ thứ gì giống như Java), nhưng nó khá dễ đọc và cực kỳ dễ hiểu.

Ngoài ra, nếu bạn thực sự muốn, bạn có thể mở bất kỳ .classtệp nào trong trình chỉnh sửa hex và đọc trực tiếp mã bytecode. Kết quả là giống hệt như sử dụng javap.


0

Không cần phải dịch ngược Applet.class. Mã nguồn của các lớp API Java công khai đi kèm với JDK (nếu bạn chọn cài đặt nó) và dễ đọc hơn mã bytecode đã được dịch ngược. Bạn có thể tìm thấy tệp nén trong src.zip (nằm trong thư mục cài đặt JDK của bạn).



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.