2015-04-27 12 views
15

Làm cách nào để tìm một lớp bên trong ẩn danh nếu tôi chỉ được cho biết tên của lớp Class$N khi sử dụng Eclipse, mà không phải trải qua mã và đếm từng lớp ẩn danh? Có tính năng 'chuyển sang khai báo lớp ẩn danh' ở nơi tôi có thể nhập số hậu tố $?

Tính năng tìm kiếm-> Java không hữu ích.

Tôi đang sử dụng VisualVM để tìm các điểm nóng CPU. Điểm phát sóng của tôi nằm trong một lớp ẩn danh có tên SomeClass $ 5. VisualVM không thể tìm thấy nguồn cho lớp của tôi và tôi (và những người khác) không thể tìm thấy cách đính kèm nguồn vào VisualVM, được hiển thị herehere. Plugin trình khởi chạy không giải quyết vấn đề này. Việc đếm các khai báo ẩn danh không phải là một lựa chọn vì trong dài hạn, nguy cơ lỗi của con người phân loại qua hàng trăm dòng có thể dẫn đến lãng phí rất nhiều thời gian khi cố gắng làm việc trên lớp vô danh chỉ để tìm ra lớp sai.

Để giải quyết sự cố, tôi đang thử nghiệm các lớp học với 'System.out.println("this="+this.getClass().getName());' trong một phương pháp để đảm bảo nó là đúng, nhưng phải có cách tốt hơn.

+0

Câu hỏi hay. Tôi biết hai cách: Đếm (dễ bị lỗi) và đặt tên cho lớp (tức là biến một lớp ẩn danh thành một lớp bên trong), loại đó phá hủy lợi ích của lớp ẩn danh. Plus khi tôi nghĩ về Java 8 ... nên có một cách tốt hơn. –

+4

Hai cách khác để tìm khai báo: 'Class.forName (" SomeClass $ 5 ") getEnclosingClass/Method/Constructor()' (nhưng có thể không rõ ràng nếu có nhiều lớp ẩn danh trong cùng phạm vi). 'javap -v SomeClass $ 5.class' và kiểm tra các thuộc tính LineNumberTable của các phương thức (nhưng có thể không có mặt nếu các tệp .class được biên dịch mà không có thông tin gỡ lỗi hoặc bị làm xáo trộn). (Những điều này không giúp Eclipse hoặc VisualVM tìm mã của bạn một cách tự động, và vì vậy đừng trả lời câu hỏi như đã đặt ra.) –

+1

Chỉ cần thông tin về YourKit Java Profiler: "... Hãy lưu ý khả năng cực kỳ hữu ích để xác định vị trí mã của các lớp ẩn danh và phương pháp của chúng, đó là một việc rất khó thực hiện một cách thủ công. " [link] {https://www.yourkit.com/docs/80/help/eclipse.jsp} –

Trả lời

3

Tôi không biết cách thực hiện điều này trong Eclipse, nhưng tôi có thể cung cấp hai cách khác để tìm ra tuyên bố.


Bạn có thể gọi Class.forName("SomeClass$5"), sau đó gọi một trong Class.getEnclosingMethod hoặc Class.getEnclosingConstructor hoặc Class.getEnclosingClass để tìm định nghĩa ngay lập tức kèm theo của nó. Điều này có thể không rõ ràng nếu nhiều lớp ẩn danh nằm trong cùng một thành viên kèm theo, nhưng nó cung cấp cho bạn một nơi nào đó để bắt đầu tìm kiếm.


Bạn có thể tháo rời tệp lớp đã biên dịch bằng công cụ javap với javap -v SomeClass$5.class. Nếu tệp lớp được biên dịch với thông tin gỡ lỗi và lớp ẩn danh chứa ít nhất một định nghĩa phương thức, thuộc tính LineNumberTable của (các) định nghĩa phương thức đó sẽ cho biết vị trí chúng được xác định trong tệp nguồn. Thuộc tính SourceFile sẽ chứa tên tệp nguồn. Thuộc tính EnclosingMethod sẽ đặt tên cho phương thức kèm theo (nếu có) và thuộc tính InnerClasses sẽ có thông tin về các lớp bên trong và bên trong (bao gồm các lớp không liên quan chỉ đơn thuần là được sử dụng, vì vậy hãy cẩn thận khi diễn giải).

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