2017-03-23 12 views
3

私はランダムにコード&に問題が発生しました。匿名の内部クラス内で定義されているクラスE(以下に示す)をインスタンス化する方法。以下のように:あなたはそれを行うためにnewに通常の呼び出しを使用するプログラムを書くことはできません匿名の内部クラスで定義されたクラスをインスタンス化する方法はありますか?

A c = new A() { 
    class E{ //Statements 
    } 
}; 
+0

Aの外に匿名クラスを宣言してみませんか?あなたはその場合にAの中で使うことができます。 –

+0

いいえ、それは何かをinstanciateするために内部の無条件のクラスなので、彼は見なければならない(外側と言う)と知っている必要があります(実際にはおそらくすべての時間)が、匿名ですので、NO –

+0

@MohammedHousseynTaleb: 。 –

答えて

2

:インスタンス化されるクラスのためには、名前を持っている必要があります。匿名の内部クラスは、その用語が暗示する通り、ではなく、という名前を持っています。

したがって、その匿名の内部クラス内に存在するクラスにも名前はありません。したがって、その匿名の内部クラスのの外にをインスタンス化することはできません。

反射を使用できます。

import java.util.*; 
import java.lang.reflect.*; 

class B { 
    B() { System.out.println("B"); } 
    void foo() { System.out.println("B.foo"); } 
} 

public class Test{ 
    B b; 
    void bar() { 
    b = new B() { 
      class C { C() { System.out.println("inner C"); } } 
      void foo() { System.out.println("inner foo"); } 
    }; 
    b.foo(); 
} 
public static void main(String[] args) throws Exception { 
    Test test = new Test(); 
    test.bar(); 

    Class<?> enclosingClass = Class.forName("Test$1"); 
    Class<?> innerClass = Class.forName("Test$1$C"); 

    Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass); 
    Object innerInstance = ctor.newInstance(test.b); 
    } 
} 

この版画:私のTest.javaを参照してください

B 
inner foo 
inner C 

ので、はい、私たちは、実行時にマングルされたクラス名Test$1$Cを使用することができ、その反射に私たちを可能にするという事実に与えられました実行時にオブジェクトをインスタンス化します(詳細はhereを参照)。最終的な答えは:はい、それは です。です。

実際には、実際のコードでこれを行う必要があるということではありません。これは創造性を養う素敵な小さなパズルです。現実世界の何にも適していません。

実際のところ、匿名の内部クラス内の内部クラスは設計上のバグです。物語の終わり。

+0

だから。匿名の内部クラスで定義されたクラスをインスタンス化する方法はありませんか? –

+0

途中で面白い逸話:私は実際に "私は自分自身を検索するときにJonSkeetの答えにぶつかることはない"と考えました。そして、私はちょうど答えが私は "どのように反射を使用して内部クラスをインスタンス化する" ... JonSkeetの答えから得たことを認識します。とてもかっこいい。今、私は毎日の制限を打つために2つのアップデートを追加しました;-) – GhostCat

+0

@GhostCat +1は私の答えを削除しました。これはより直接的かつより良い方法で問題を解決するからです:) – Mikenno

関連する問題