2012-02-21 12 views
6

Khi dịch ngược một lọ cụ thể bằng cách sử dụng trình giải mã java (http://java.decompiler.free.fr/) Tôi nhận được một số mã lạ Tôi không thể xác định được là gì. Ai đó có thể giúp tôi? mã là cái gì đó như:java decompilation

Foo.access$004(Foo.this); 

hay này

Bar.access$006(Bar.this); 

hoặc khác

Baz.access$102(Baz.this, true) 

những phương pháp access$004, access$006access$102 là gì?

+3

Một câu hỏi tương tự đã được hỏi và nhận được một số câu trả lời hay [tại đây] (http://stackoverflow.com/questions/5524358/what-is-this-referencing). – cutchin

+1

Bạn có muốn sử dụng trình biên dịch ngược này hay thay vào đó là tùy chọn sử dụng JAD? http://www.varaneckas.com/jad –

+0

Bạn không biết tại sao, Gergely? :) Jörn đúng. JD không nhận biết tất cả các mẫu mã cho các phương thức tổng hợp. –

Trả lời

13

Các phương pháp tổng hợp như thế này được tạo để hỗ trợ việc áp dụng các phương thức riêng tư của các lớp bên trong. Vì các lớp bên trong không phải là một phần của phiên bản jvm ban đầu, nên các trình sửa đổi truy cập có thể không thực sự xử lý trường hợp này. Giải pháp là tạo ra các phương thức hiển thị gói bổ sung ủy nhiệm cho việc thực hiện riêng tư.

public class Example { 
    private static class Inner { 
     private void innerMethod() { ... } 
    } 

    public void test() { 
     Inner inner = ... 
     inner.innerMethod(): 
    } 
} 

Các biên dịch sẽ tạo ra một phương pháp mới của lớp Inner như thế này:

static void access$000(Inner inner) { 
    inner.innerMethod(); 
} 

Và thay thế các cuộc gọi trong phương pháp test như thế này:

Inner.access$000(inner); 

Các tĩnh access$000 là gói có thể nhìn thấy và do đó có thể truy cập từ lớp bên ngoài, và được bên trong cùng một lớp Inner nó có thể ủy quyền cho riêng tư innerMethod.

2

Đây là các phương thức được tạo tự động do trình biên dịch tạo trong một số trường hợp (ví dụ: khi truy cập các trường riêng tư của lớp khác trực tiếp, ví dụ: trong trường hợp các lớp lồng nhau).

Xem thêm What is the meaning of "static synthetic"?Synthetic Class in Java.

0

Nếu bạn nhận được file .class có liên quan (chạy jar qua unzip), và chạy file .class qua JAD

JAD MyClass.class 

sau đó bạn có thể thấy rằng các tập tin đầu ra JAD đã dịch ngược dòng cụ thể trong một cách có ý nghĩa hơn, ví dụ

Baz.access$102(Baz.this, true) 

xuất hiện trong đầu ra JAD như đơn giản

myMemberVaiable = true 

nơi myMemberVaiable là thành viên của lớp Baz mà bạn sẽ nhận ra.