有没有办法实例化匿名内部类中定义的类?

时间:2017-03-23 18:34:48

标签: java anonymous-inner-class

我随机写了一个代码&遇到了一个问题:如何实例化在匿名内部类中定义的E类(如下所示);喜欢:

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

1 个答案:

答案 0 :(得分:2)

您无法编写使用new普通调用的程序来执行此操作:为了实例化类,它必须具有名称。如该术语所暗示的,匿名内部类具有名称。

因此,在该匿名内部类中存在的类也没有名称;因此,它无法在匿名内部类的外部实例化。

您可以使用反射。请参阅我的Test.java:

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);
  }
}

打印:

B
inner foo
inner C

所以,是的,鉴于我们可以在运行时使用 mangled 类名Test$1$C,并且该反射允许我们在运行时实例化对象(参见{{3对于细节),最终的答案是:是的,它是 可能

但仅仅是为了记录:这并不意味着人们应该在实际代码中做这样的事情。这是培养创造力的一个很好的小谜题;但不适合现实世界中的任何事物。

在现实世界中,匿名内部类中的内部类是设计错误。故事结束。