Comment instancier un intérieur de classe avec la réflexion en Java?
J'essaie d'instancier l'intérieur de la classe définie dans le code Java suivant:
public class Mother {
public class Child {
public void doStuff() {
//...
}
}
}
Lorsque j'essaie d'obtenir une instance de l'Enfant de cette
Class<?> clazz= Class.forName("com.mycompany.Mother$Child");
Child c = clazz.newInstance();
- Je obtenir cette exception:
java.lang.InstantiationException: com.mycompany.Mother$Child
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
...
Ce qui me manque ?
- Uhm, l'intérieur de votre classe n'est pas statique... Est-ce fait exprès? Venant d'un C# arrière-plan peut-être? 😉
- Merci pour suggérer "statique" idée! En fait, à l'aide d'une statique de la classe imbriquée au lieu d'un intérieur de classe me rendre la vie plus facile.
- La chose est, si l'intérieure de la classe n'est pas déclarée statique, les instances de cette classe dépendent de l'existence d'une instance de l'extérieur de la classe; c'est à partir de C#, où toutes les classes internes sont "statiques" par défaut, et peut être instancié sans un parent de l'instance.
Vous devez vous connecter pour publier un commentaire.
Il y a un supplément de "caché" paramètre, qui est l'instance de la classe englobante. Vous aurez besoin d'obtenir le constructeur à l'aide de
de la Classe.getDeclaredConstructor
et ensuite de fournir une instance de la classe englobante comme argument. Par exemple:EDIT: Sinon, si la classe imbriquée n'ont pas réellement besoin de se référer à une instance englobante, d'en faire un imbriquée statique classe à la place:
ctor.setAccessible(true)
afin de le faire fonctionner!Ce code créer intérieure instance de classe.