2011-10-18 5 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から始まるので、私の推測では、あなたの問題である3番目に宣言された匿名クラスになります。

このような状況では、コードをリファクタリングして匿名のクラスを持たない方がよい場合があります。それ以外の場合は、デバッガを接続してコードをステップ実行することをお勧めします。

1

コードを安全にコンパイルすると、MyActivity $ 1.class、MyActivity $ 2.class、MyActivity $ 3.classなどがあります。あなたは例外をスローしている匿名クラスを識別するために(あなたの.classを介して)java逆コンパイラを使うことができます。

4

ヒント:どのクラスがどこにあるのか、デバッガは何とか知っています。だからあなたもできる!

は2つの匿名クラスで、この例で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。行番号に注意してください:ソースファイル内のどこにクラスが定義されているかのヒントを提供します。

関連する問題