如何在Java中使用reflection来实例化内部类?
我尝试实例化下面的Java代码中定义的内部类:
public class Mother { public class Child { public void doStuff() { // ... } } }
当我试图得到像这样的孩子的一个实例
Class<?> clazz= Class.forName("com.mycompany.Mother$Child"); Child c = clazz.newInstance();
我得到这个例外:
java.lang.InstantiationException: com.mycompany.Mother$Child at java.lang.Class.newInstance0(Class.java:340) at java.lang.Class.newInstance(Class.java:308) ...
我错过了什么?
有一个额外的“隐藏”参数,这是封闭类的实例。 您将需要使用Class.getDeclaredConstructor
获取构造函数,然后提供封闭类的实例作为参数。 例如:
// All exception handling omitted! Class<?> enclosingClass = Class.forName("com.mycompany.Mother"); Object enclosingInstance = enclosingClass.newInstance(); Class<?> innerClass = Class.forName("com.mycompany.Mother$Child"); Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass); Object innerInstance = ctor.newInstance(enclosingInstance);
编辑:另外,如果嵌套类实际上不需要引用一个封闭的实例,而是使其嵌套静态类:
public class Mother { public static class Child { public void doStuff() { // ... } } }
这段代码创build了内部类的实例。
Class childClass = Child.class; String motherClassName = childClass.getCanonicalName().subSequence(0, childClass.getCanonicalName().length() - childClass.getSimpleName().length() - 1).toString(); Class motherClassType = Class.forName(motherClassName) ; Mother mother = motherClassType.newInstance() Child child = childClass.getConstructor(new Class[]{motherClassType}).newInstance(new Object[]{mother});
- 如何find哪些promise在nodejs中未处理UnhandledPromiseRejectionWarning?
- 什么是扩展JavaScript错误的好方法?
- 如果您在“我们不使用例外”阵营,那么您如何使用标准库?
- 什么是正确的方式来显示完整的InnerException?
- 未检测到多处理池中引发的exception
- 报告Google Analytics(分析).jsexception跟踪的例外情况
- 为什么.NETexception不被try / catch块捕获?
- 在没有例外的情况下,C ++exception以何种方式减慢代码?
- 我应该总是在`except`语句中指定一个exceptiontypes吗?