2011-10-18 20 views
7

Tôi đã sử dụng công cụ MAT trong Eclipse để điều tra vấn đề rò rỉ bộ nhớ. Tôi thấy rằng sự rò rỉ là do một cá thể lớp bên trong vô danh trong ứng dụng của tôi. Tên lớp được hiển thị trong MAT là com.mycompany.myproduct.MyActivity $ 3. Có nhiều lớp bên trong vô danh được định nghĩa trong MyActivity.java. Làm cách nào để biết lớp bên trong nào com.mycompany.myproduct.MyActivity $ 3 cho biết?làm thế nào để tìm ra lớp ẩn danh bên trong được chỉ định bởi tên lớp?

Cảm ơn.

Trả lời

4

Trên trình biên dịch Oracle, chúng được đánh số theo thứ tự xuất hiện trong lớp. Tôi không chắc liệu đó có phải là một phần của bất kỳ đặc điểm kỹ thuật nào hay phù hợp với các triển khai khác.

Bạn có thể dịch ngược lớp - JD-GUI là một công cụ tuyệt vời cho điều đó - và sau đó bạn sẽ thấy những gì bạn muốn biết. Bạn thậm chí có thể chỉ cần tháo gỡ cơ bản bằng cách sử dụng javap -c. Nó sẽ cung cấp cho bạn một ý tưởng sơ bộ về nơi các lớp học xảy ra.

0

Toàn bộ điểm của các lớp ẩn danh là chúng chỉ là vậy. Như bạn đã tìm thấy nó không dễ dàng để tìm ra cái nào đến từ nó. Thông thường việc đánh số bắt đầu từ một, vì vậy tôi đoán là nó sẽ là lớp ẩn danh thứ ba mà là vấn đề của bạn.

Trong trường hợp này, bạn nên cải tiến lại mã của mình để không có bất kỳ lớp ẩn danh nào. Nếu không, tôi đề nghị gắn trình gỡ rối và đẩy mã.

1

Khi bạn biên dịch mã của mình một cách an toàn, bạn có MyActivity $ 1.class, MyActivity $ 2.class, MyActivity $ 3.class, v.v. Bạn có thể sử dụng trình giải mã java (trên lớp của bạn) để xác định lớp ẩn danh đang ném ngoại lệ.

4

Gợi ý: trình gỡ rối bằng cách nào đó biết lớp nào là ở đâu. Vì vậy, bạn có thể, quá!

Hãy thử sử dụng javap trên ví dụ này với hai lớp vô danh:

import java.util.*; 

public class Test { 
    public static void main(String [] args) { 
     Map m = new HashMap(){{System.out.print(1);}}; 
     Map m1 = new HashMap(){{System.out.print(2);}}; 
    } 
} 

Biên dịch và chạy javap -c -l:

$ javap -c -l Test 
Compiled from "Test.java" 
public class Test extends java.lang.Object{ 
public Test(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

    LineNumberTable: 
    line 3: 0 



public static void main(java.lang.String[]); 
    Code: 
    0: new #2; //class Test$1 
    3: dup 
    4: invokespecial #3; //Method Test$1."<init>":()V 
    7: astore_1 
    8: new #4; //class Test$2 
    11: dup 
    12: invokespecial #5; //Method Test$2."<init>":()V 
    15: astore_2 
    16: return 

    LineNumberTable: 
    line 5: 0 
    line 7: 8 
    line 9: 16 



} 

Như bạn có thể thấy, lớp đầu tiên có tên Test$1, điều thứ hai - Test$2. Hy vọng tat giúp.

Để biết thêm thông tin cụ thể, hãy dịch ngược các lớp cụ thể mà bạn quan tâm, ví dụ: javap -c -l Test\$2. Hãy chú ý đến số dòng: chúng sẽ cho bạn một gợi ý về vị trí trong tệp nguồn mà lớp đã được định nghĩa.

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