有什么方法可以实例化在匿名内部 class 中定义的 class 吗?
Is there any way to instantiate a class defined in anonymous inner class?
我随机写了一个代码,遇到了一个问题:如何实例化在匿名内部class中定义的class E(如下所示);喜欢:
A c = new A() {
class E{ //Statements
}
};
您不能编写使用对 new
的普通调用来执行此操作的程序:为了实例化 class,它必须具有 名称。匿名内部 classes,顾名思义,没有 有名字。
因此存在于那个匿名内部 class 中的 class 也没有名字;因此它不能在匿名内部 class.
的 外部 实例化
但是你可以使用反射。看我的 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");
Class<?> innerClass = Class.forName("Test$C");
Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);
Object innerInstance = ctor.newInstance(test.b);
}
}
这会打印:
B
inner foo
inner C
所以,是的,鉴于我们可以在运行时使用 mangled class 名称 Test$C
,并且反射允许我们实例化对象在运行时也是如此(详见here),最后的答案是:是的,它是
可能.
但仅作记录:这根本不意味着人们应该在实际代码中做这样的事情。这是一个很好的培养创造力的小拼图;但不适用于现实世界中的任何事物。
在现实世界中,匿名内部 class 中的内部 class 是一个设计错误。故事结束。
我随机写了一个代码,遇到了一个问题:如何实例化在匿名内部class中定义的class E(如下所示);喜欢:
A c = new A() {
class E{ //Statements
}
};
您不能编写使用对 new
的普通调用来执行此操作的程序:为了实例化 class,它必须具有 名称。匿名内部 classes,顾名思义,没有 有名字。
因此存在于那个匿名内部 class 中的 class 也没有名字;因此它不能在匿名内部 class.
的 外部 实例化但是你可以使用反射。看我的 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");
Class<?> innerClass = Class.forName("Test$C");
Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);
Object innerInstance = ctor.newInstance(test.b);
}
}
这会打印:
B
inner foo
inner C
所以,是的,鉴于我们可以在运行时使用 mangled class 名称 Test$C
,并且反射允许我们实例化对象在运行时也是如此(详见here),最后的答案是:是的,它是
可能.
但仅作记录:这根本不意味着人们应该在实际代码中做这样的事情。这是一个很好的培养创造力的小拼图;但不适用于现实世界中的任何事物。
在现实世界中,匿名内部 class 中的内部 class 是一个设计错误。故事结束。