我在Eclipse中使用MAT工具来调查内存泄漏问题。我发现泄漏是由我的应用程序中的匿名内部类实例引起的。 MAT中显示的类名是com.mycompany.myproduct.MyActivity $ 3。 MyActivity.java中定义了许多匿名内部类。我怎么知道com.mycompany.myproduct.MyActivity $ 3指示哪个内部类?
感谢。
答案 0 :(得分:4)
在Oracle编译器上,它们按类中的出现顺序编号。我不确定这是否是任何规范的一部分或与其他实现一致。
你可以反编译课程 - JD-GUI是一个很好的工具 - 然后你会看到你想知道的。您甚至可以使用javap -c
进行基本反汇编。它会让你大致了解课程的出现位置。
答案 1 :(得分: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
:
$ 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
。注意行号:它们会给你一个关于源文件中定义类的位置的提示。
答案 2 :(得分:1)
当你安全地编译你的代码时,你有MyActivity $ 1.class,MyActivity $ 2.class,MyActivity $ 3.class,等等。您可以使用java反编译器(通过.class)来识别抛出异常的anonymus类。
答案 3 :(得分:0)
匿名类的重点在于它们就是这样。正如你发现它不容易弄清楚它来自哪一个。通常编号从一开始,所以我的猜测是它将是你问题的第三个声明的匿名类。
在这种情况下,您最好重构代码以避免任何匿名类。否则我建议附加调试器并踩代码。