2009-12-02 45 views
14

Có thể chuyển đổi tệp .class thành .java tệp không?Mã byte vào mã nguồn Java

Làm cách nào để thực hiện điều này?

Điều gì về tính đúng đắn của mã được trích xuất từ ​​tùy chọn này?

Trả lời

16

Có thể. Bạn cần một trình giải mã Java để làm điều này.

Bạn sẽ tìm thấy chủ yếu là nó sẽ làm một công việc đáng ngạc nhiên tốt. Những gì bạn sẽ nhận được là tệp hợp lệ .java sẽ biên dịch thành tệp .class nhưng tệp .java này không nhất thiết phải giống với mã nguồn ban đầu. Những thứ như cấu trúc vòng lặp có thể xuất hiện khác nhau và bất kỳ thứ gì chỉ là thời gian biên dịch, chẳng hạn như generics và chú thích sẽ không được tạo lại.

Bạn có thể gặp sự cố nếu the code has been obfuscated. Đây là một quá trình làm thay đổi các tệp lớp để làm cho chúng khó dịch ngược. Ví dụ: tên lớp và tên biến được thay đổi thành tất cả giống nhau nên bạn sẽ kết thúc bằng mã như aa.a(ab) thay vì employee.setName(name) và rất khó để tìm ra những gì đang diễn ra.

Tôi nhớ sử dụng JAD để thực hiện việc này nhưng tôi không nghĩ rằng điều này được duy trì tích cực để nó có thể không hoạt động với mọi phiên bản Java. A Google search for java decompiler sẽ cung cấp cho bạn nhiều tùy chọn.

0

Có thể, nhưng mã bạn sẽ nhận được có thể không chính xác. Tìm kiếm một số trình giải mã Java mặc dù.

0

Luôn luôn có thể. Tìm kiếm "java disassembler".

Nhưng nhận xét mã nguồn và biến tạm thời sẽ không khả dụng.

Nếu bạn dịch ngược một lớp và xem mã quá phức tạp với tên biến và tên phương thức giống như a, b, c ... có nghĩa là dự án bị làm mờ.

+0

Tôi nghĩ rằng nó không bị che khuất vì nó luôn luôn có thể. Tôi nghĩ rằng có một số cấu trúc bytecode không có tương đương trong Java, cũng có một số ngôn ngữ/công cụ genrate .class từ các nguồn khác (Scala ...). –

+1

Hài hước ... Chúng ta đang nói về Java và bytecode ở đây. – JCasso

+0

vì vậy tôi ... nhưng OP đã không đề cập rằng lớp. Được tạo ra (trực tiếp) từ Java. Và cảm ơn ... –

1

Điều này có thể sử dụng một trong số Java decompilers có sẵn. Vì bạn đang làm việc từ byte-code có thể đã được tối ưu hóa bởi trình biên dịch (nội tuyến các biến tĩnh, tái cấu trúc luồng điều khiển vv) những gì bạn nhận ra có thể không chính xác giống như mã đã được biên dịch ban đầu nhưng nó sẽ có chức năng tương đương.

0

Không chính xác một decompiler, nhưng JDK contains javap, a disassembler:

javap -c org.example.MyClass 

Tùy thuộc vào usecase của bạn, nó vẫn có thể là thú vị khi biết hoặc sử dụng.

Lưu ý rằng kết quả của việc giải mã tệp lớp phụ thuộc vào thông tin được bao gồm trong tệp lớp. Nếu tôi nhớ chính xác, bao gồm thông tin gỡ lỗi (see -g flag of javac) là quan trọng, đặc biệt là để đặt tên cho các biến và tương tự.

0

Tôi đã được sử dụng JAD, nhưng sau đó chuyển sang nhau, mà theo ý kiến ​​của tôi là tốt hơn - here

0

DJ là dễ sử dụng java decompiler. Chỉ cần mở bất kỳ tệp .class nào và nó sẽ hiển thị cho bạn mã số java của nó.

Ngoài ra, bạn có thể sử dụng jadClipse plugin cho eclipse để trực tiếp dịch ngược .class vào java

What about the correctness of the code extracted from this option?
Trong mọi trường hợp, mã sẽ được tạo ra bởi bất kỳ decompiler java sẽ không phải là giống như nó được viết trong lớp java gốc. Vì nó chỉ giải mã bytecode thành mã java. Điều duy nhất bạn có thể chắc chắn là, đầu ra sẽ giống như đầu ra của mã java gốc.

+0

+1 cho đầu ra sẽ giống như đầu ra của mã java gốc –

1

Thêm vào câu trả lời trước: Gần đây, một làn sóng mới của phần mềm ăn cắp đã được sắp tới, cụ thể là Procyon, CFR, JD, Fernflower

Dưới đây là danh sách các phần mềm ăn cắp hiện đại như tháng Ba, 2015:

  • Procyon
  • CFR
  • JD
  • Fernflower

Bạn có thể kiểm tra ở trên đề cập đến các trình dịch ngược trực tuyến, không cần cài đặt và thực hiện lựa chọn được giáo dục của riêng bạn. Trình giải mã Java trong đám mây:http://www.javadecompilers.com/