【问题标题】:Is there any way to instantiate a class defined in anonymous inner class?有没有办法实例化匿名内部类中定义的类?
【发布时间】:2017-03-23 18:34:48
【问题描述】:

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

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

【问题讨论】:

  • 为什么不在A之外声明匿名类呢?在这种情况下,您可以在 A 中使用它。
  • 不,因为它是一个内部匿名类来实例化他必须被看到的东西(比如说外部)并且它必须是知道的(不是真的,但也许一直都是)但是是匿名的,所以不跨度>
  • @MohammedHousseynTaleb:请说清楚一点。
  • 对不起我的英语不好,但我想说的是关于逻辑,实例化是关于可见性,在你的情况下,一个内部匿名类在他的父类之外不可见(比如说 scoop),更多我们必须注意,您的示例更难,因为您的匿名内部类只是您的实例 new A() 的属性(数学上说)。所以试着成为一个人性化的班级,你想调用隐藏在我口袋里的我的内心班级,知道这个班级有人不认识的人已经做到了……这在某种程度上是哲学的,所以试着阅读更多关于 OO 范式的信息。
  • @SuyashJain 回答如下,它需要一个解决方法,因为要访问它需要一个标识符,因此我在下面的答案中提出了一个解决方案,通过使用接口来访问它

标签: java anonymous-inner-class


【解决方案1】:

您不能编写使用对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 ),最后的答案是:是的,它是 可能

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

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

【讨论】:

  • 所以。没有办法实例化匿名内部类中定义的类??
  • 一路上有趣的轶事:我实际上想过“我自己在搜索 SO 时从未遇到过 JonSkeet 的答案”。而且我刚刚意识到我得到的答案是“如何使用反射来实例化内部类”......来自 JonSkeet 的答案。很酷。现在我只需再更新两次即可达到每日限制,结束这个 kewl 日 ;-)
  • @GhostCat +1 删除了我的答案,因为这以更直接和更好的方式解决了问题:)
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多