簡體   English   中英

如何確定一個類名所指示的內部匿名類?

[英]how to figure out which inner anonymous class indicated by a class name?

我在Eclipse中使用MAT工具來研究內存泄漏問題。 我發現泄漏是由我的應用程序中的匿名內部類實例引起的。 MAT中顯示的類名是com.mycompany.myproduct.MyActivity $ 3。 MyActivity.java中定義了許多匿名內部類。 我怎么知道com.mycompany.myproduct.MyActivity $ 3指示哪個內部類?

謝謝。

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

你可以反編譯這個類 - JD-GUI是一個很好的工具 - 然后你會看到你想知道的。 你甚至可以使用javap -c進行基本的反匯編。 它會讓你大致了解類的出現位置。

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

嘗試在這個例子中使用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

$ 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 注意行號:它們會給你一個關於源文件中定義類的位置的提示。

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

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

在這種情況下,您最好重構代碼以避免任何匿名類。 否則我建議附加調試器並踩代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM