2011-10-18 72 views
7

我在Eclipse中使用MAT工具來調查內存泄漏問題。我發現泄漏是由我的應用程序中的匿名內部類實例引起的。 MAT中顯示的類名是com.mycompany.myproduct.MyActivity $ 3。在MyActivity.java中定義了許多匿名內部類。我如何知道哪些內部類com.mycompany.myproduct.MyActivity $ 3表示?如何找出類名所表示的內部匿名類?

謝謝。

回答

4

在Oracle編譯器上,它們按照類中出現的順序編號。我不確定這是否是任何規範的一部分,或與其他實現一致。

您可以反編譯該類 - JD-GUI是一個很好的工具 - 然後你會看到你想知道的。你甚至可以使用javap -c進行基本的拆卸。它會給你一個關於班級在哪裏出現的粗略想法。

0

匿名類的重點在於它們就是這樣。正如你發現不容易找出它來自哪一個。通常編號從一開始,所以我的猜測是它將是您的問題的第三個聲明的匿名類。

在這種情況下,您可能最好重構代碼以避免使用任何匿名類。否則,我建議附加調試器並逐步執行代碼。

1

當您安全地編譯您的代碼時,您有MyActivity $ 1.class,MyActivity $ 2.class,MyActivity $ 3.class等等。您可以使用Java反編譯器(通過.class)來識別拋出異常的anonymus類。

4

提示:調試器以某種方式知道哪些類是哪裏。所以你也可以!

嘗試在這個例子中使用javap有兩個匿名類:

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);}}; 
    } 
} 

編譯並運行​​:

$ 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 



} 

正如你所看到的,第一類有名字Test$1,第二個 - Test$2。希望達幫助。

有關更多具體信息,請反編譯您感興趣的特定課程,例如, javap -c -l Test\$2。注意行號:他們會給你提示類文件在源文件中的定義。