2011-09-07 39 views
10

Tôi có một bình java Tôi đã biên dịch lại với sự cho phép của nhà phát triển ban đầu mà chúng tôi đang sử dụng cho đến khi họ có thể nhận được chúng tôi một bản sao của mã nguồn. Tôi đã chạy vào một thành viên của một lớp trông giống như sau:

Classname.access$002(Param1, Param2); 

classname là đúng, nhưng truy cập $ 002 không nhìn bên phải (có một vài người khác như thế này ngoại trừ với những cái tên truy cập $ 204 và với các số khác được nối vào cuối), và tôi tự hỏi liệu điều này có nghĩa là bất kỳ thứ gì trong Java hay không bởi vì thao tác dịch ngược không đầy đủ.

Tôi đang sử dụng JD-GUI để dịch ngược các lớp. Cũng cần lưu ý rằng không có phương pháp nào có cùng chữ ký với phương thức truy cập $ 002, ít nhất là trong Class Classname.

+0

Các liên kết này có thể trợ giúp: http://www.retrologic.com/innerclasses.doc7.html và http://stackoverflow.com/questions/6167326/java-class-name-containing-dollar-sign - liên kết đầu tiên đề cập rằng chúng có thể là các phương thức được tạo ra như là một phần của các lớp truy cập nội bộ để giúp JVM hiểu được việc nhóm các lớp có thể truy cập một số thành viên. – birryree

+1

Thuật ngữ kỹ thuật là bộ truy cập tổng hợp. – McDowell

Trả lời

17

Phương thức access$XXX là các cuộc gọi từ các lớp không tĩnh bên trong đến các thành viên của lớp lồng.

public class DummyDummy { 

private int x = 0; 
private Inner i = new Inner(); 
private int foo(int a, int b) { 
    return a+b+x; 
} 

private class Inner { 
    void doIt() { 
     System.out.println(
     // Here, DummyDummy.access$0(DummyDummy, int, int) is called 
     // which calls DummyDummy.foo(int, int) 
      foo(1,2)    ); 
    } 
} 

public static void main(String[] args) { 
    new DummyDummy().i.doIt(); 
} 

} 
+0

Nó là một [phương pháp tổng hợp] được tạo ra (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html#isSynthetic()) – Radim

Các vấn đề liên quan