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