我随机编写代码并遇到一个问题:如何实例化在匿名内部类中定义的类 E(如下所示);喜欢:
A c = new A() {
class E{ //Statements
}
};
您无法编写使用普通调用的程序new
为此:为了实例化一个类,它必须有一个name。正如该术语所暗示的那样,匿名内部类确实not有名字。
因此,存在于该匿名内部类中的类也没有名称;因此它不能被实例化outside那个匿名内部类的。
But您可以使用反射。请参阅我的 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详情),最终答案是:是的,是的possible.
但仅供记录:这并不意味着人们应该在实际代码中做这样的事情。这是一个很好的小拼图,可以训练创造力;但不适合现实世界中的任何事情。
在现实世界中,匿名内部类中的内部类是一个设计错误。故事结局。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)