2

匿名内部クラスはどのように作成され、JVM によって識別されますか?

たとえば、同じインターフェイスのいくつかの匿名内部クラスを作成し、それぞれに固有の実装を持たせることができます。そして、これらはすべて同じ(明示的な)クラス内にある可能性があるため、それが配置されているクラスが完全な識別子になることはできません。では、JVM は匿名オブジェクトを別のオブジェクトから判別するためにどのような情報を使用するのでしょうか? (私が考えることができる唯一のことは、それが宣言された行番号ですが、それは本当の答えであるには少し人間的すぎるようです.)

.classコンパイラがこれらのために生成するファイルを確認する方法はありますか? それとも実行時に動的に作成されますか?

4

2 に答える 2

3

Javaコード:

   public static void main(String...args) {
    TestInter t = null; 
            t = new TestInter() { //com/next/b/Test$1 
            };
            t= new TestInter() {  //com/next/b/Test$2
            };
     }

バイトコード:

 L0
    LINENUMBER 8 L0
    ACONST_NULL
    ASTORE 1
   L1
    LINENUMBER 9 L1
    NEW com/nextcontrols/bureautest/Test$1
    DUP
    INVOKESPECIAL com/next/b/Test$1.<init>()V
    ASTORE 1
   L2
    LINENUMBER 11 L2
    NEW com/nextcontrols/bureautest/Test$2
    DUP
    INVOKESPECIAL com/next/b/Test$2.<init>()V
    ASTORE 1

INVOKESPECIALバイトコードの行に注意してください

于 2012-12-27T17:29:05.513 に答える
3

次のような簡単な例を試すことで、洞察を得ることができます。

public class A {
    public static void main(String[] args)
    {
        L a = new L() { };
        L b = new L() { };
    }
}

interface L { }

上記のコードを実行すると、3 つの個別のクラス ファイルが生成されます。

A.class
A$1.class
A$2.class
于 2012-12-27T17:29:05.893 に答える