una que otra objeto nombre llevan internas estaticas dentro crear clases clase anonimas java reflection instantiationexception

que - ¿Cómo crear una instancia de una clase interna no estática con reflejo en Java?



crear un objeto de una clase dentro de otra clase (2)

Este código crea una instancia de clase interna.

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});

Intento crear una instancia de la clase interna definida en el siguiente código de Java:

public class Mother { public class Child { public void doStuff() { // ... } } }

Cuando trato de obtener una instancia de Child como esta

Class<?> clazz= Class.forName("com.mycompany.Mother$Child"); Child c = clazz.newInstance();

Obtengo esta excepción:

java.lang.InstantiationException: com.mycompany.Mother$Child at java.lang.Class.newInstance0(Class.java:340) at java.lang.Class.newInstance(Class.java:308) ...

Qué me estoy perdiendo ?


Hay un parámetro "oculto" adicional, que es la instancia de la clase adjunta. Tendrá que llegar al constructor utilizando Class.getDeclaredConstructor y luego proporcionar una instancia de la clase Class.getDeclaredConstructor como argumento. Por ejemplo:

// 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);

EDITAR: Alternativamente, si la clase anidada no necesita referirse a una instancia adjunta, conviértala en una clase estática anidada:

public class Mother { public static class Child { public void doStuff() { // ... } } }