Maison  >  Article  >  Java  >  Comment pouvez-vous instancier une classe interne à l’aide de Java Reflection sans instance de la classe englobante ?

Comment pouvez-vous instancier une classe interne à l’aide de Java Reflection sans instance de la classe englobante ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 00:37:03234parcourir

How Can You Instantiate an Inner Class Using Java Reflection Without an Instance of the Enclosing Class?

Instanciation de classes internes avec Java Reflection

En Java, tenter d'instancier une classe interne à l'aide de la réflexion sans fournir d'instance de la classe englobante entraîne une InstanciationException. Cela se produit car les classes internes ont une dépendance cachée sur leur instance de classe englobante.

Solution :

Pour résoudre ce problème, récupérez le constructeur de la classe interne à l'aide de Class. getDeclaredConstructor et transmettez une instance de la classe englobante comme argument lors de son instanciation.

Exemple :

<code class="java">// Assuming "com.mycompany.Mother" is the enclosing class
// and "com.mycompany.Mother$Child" is the inner class

// Get the enclosing class
Class<?> enclosingClass = Class.forName("com.mycompany.Mother");
// Instantiate the enclosing class
Object enclosingInstance = enclosingClass.newInstance();

// Get the inner class
Class<?> innerClass = Class.forName("com.mycompany.Mother$Child");
// Get the constructor with the enclosing class as a parameter
Constructor<?> ctor = innerClass.getDeclaredConstructor(enclosingClass);

// Instantiate the inner class
Object innerInstance = ctor.newInstance(enclosingInstance);</code>

Approche alternative :

Si la classe interne ne nécessite pas d'accès à une instance de classe englobante, elle peut être définie comme une classe imbriquée statique. Cela élimine la dépendance à l'égard de la classe englobante.

Exemple de classe imbriquée statique :

<code class="java">public class Mother {
     public static class Child {
          public void doStuff() {
              // ...
          }
     }
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn