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

标签 java anonymous-inner-class

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

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

最佳答案

您不能编写使用普通调用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,并且反射允许我们在运行时实例化对象,也是(详见here),最后的答案是:是的,是 可能

但只是为了记录:这根本不意味着人们应该在真实代码中做这样的事情。这是一个很好的培养创造力的小拼图;但不适用于现实世界中的任何事物。

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

关于java - 有没有办法实例化匿名内部类中定义的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42984297/

相关文章:

java - Kotlin:ObjectBox 的组合实体类和 kotlinx.Serialization 有冲突吗?

java - Thymeleaf 使用 :each 动态创建表单

java - 使用泛型类型拥有通用方法

java - 字符串在匿名内部类之外变为 null

java - 处理大数据集时减少内存流失

java - Android - 在 SQLite 数据库中搜索数据的最快方法

java - 在Java中如何从匿名类外部访问变量

java - 在 Java 中,这种类型的方法覆盖是什么?

java - 如果在 Java 中使用 "new"关键字意味着内存分配,为什么匿名内部类不是这样?