Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有方法实例化在匿名内部类中定义的类?_Java_Anonymous Inner Class - Fatal编程技术网

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

Java 有没有方法实例化在匿名内部类中定义的类?,java,anonymous-inner-class,Java,Anonymous Inner Class,我在随机编写代码时遇到了一个问题:如何实例化在匿名内部类中定义的类E(如下所示);比如: A c = new A() { class E{ //Statements } }; 您不能编写一个使用普通调用new来实现这一点的程序:为了实例化一个类,它必须有一个名称。正如该术语所暗示的,匿名内部类没有名称 因此,存在于匿名内部类中的类也没有名称;因此,它不能在该匿名内部类的外部实例化 但是您可以使用反射。请参阅my Test.java: import java.util.*;

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

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

您不能编写一个使用普通调用
new
来实现这一点的程序:为了实例化一个类,它必须有一个名称。正如该术语所暗示的,匿名内部类没有名称

因此,存在于匿名内部类中的类也没有名称;因此,它不能在该匿名内部类的外部实例化

但是您可以使用反射。请参阅my 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);
  }
}
因此,是的,考虑到我们可以在运行时使用损坏的类名
Test$1$C
,并且反射也允许我们在运行时实例化对象(有关详细信息,请参阅),最后的答案是:是的,它是 可能

但请记住:这并不意味着人们应该在真实的代码中做这样的事情。这是一个很好的小拼图来培养创造力;但不适合现实世界中的任何事情


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

为什么不在一个外部声明匿名类?在这种情况下,您可以在内部使用它。不,因为它是一个内部匿名类,用于实例化他必须看到的东西(比如说外部),并且它必须知道(不是真的,但可能一直都知道),但它是匿名的,所以NO@MohammedHousseynTaleb:请说得更清楚些。对不起,我的英语不好,但我想说的是逻辑,实例化是关于可见性的,在您的案例A中,内部匿名类在父类之外是不可见的(比如说scoop),我们更需要注意的是,您的示例更难,因为您的匿名内部类只是您的新实例A()的一个属性(数学上说)。所以,试着成为一个类,你想召唤我的内心类,它藏在我的口袋里,知道这个类是某个未知的人创造出来的。。。这在某种程度上是哲学性的,所以请尝试阅读更多关于OO范式的内容。@SuyashJain如下面所回答的,它需要一个解决方案,因为要访问它,它需要一个标识符,因此我在下面的回答中提出了一个解决方案,通过使用接口而不是使用接口来访问它。没有办法实例化在匿名内部类中定义的类??一路上有个有趣的轶事:我实际上想到了“我自己搜索时从未遇到JonSkeet答案”。我刚刚意识到我得到的答案是“如何使用反射实例化内部类”。。。从JonSkeet的回答中。很酷。现在,我只需再更新两次就可以达到每日极限,结束这一天;-)@GhostCat+1删除了我的答案,因为这样可以更直接、更好地解决问题:)
B
inner foo
inner C