有没有办法实例化匿名内部类中定义的类?
我随机编写了一个代码并遇到了一个问题:如何实例化在匿名内部类中定义的E类(如下所示); 喜欢:
A c = new A() { class E{ //Statements } };
您不能编写使用普通调用new
来执行此操作:为了实例化类,它必须具有名称 。 正如该术语所暗示的那样,匿名内部类没有名称。
因此,存在于该匿名内部类中的类也没有名称; 因此它不能在匿名内部类之外实例化。
但你可以使用reflection 。 看我的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
所以,是的,鉴于我们可以在运行时使用受损的类名Test$1$C
,并且该reflection允许我们在运行时实例化对象(详见此处 ),最终答案是:是的,它是可能 。
但仅仅是为了记录:这并不意味着人们应该在实际代码中做这样的事情。 这是培养创造力的一个很好的小谜题; 但不适合现实世界中的任何事物。
在现实世界中,匿名内部类中的内部类是设计错误。 故事结局。