J'ai besoin de créer de nouvelles instances de nombreuses classes. J'utilise la réflexion mais lorsque je fais c.newinstance (), les classes sans "constructeur de paramètres vide" jette une java.lang.instaniationException. P>
Maintenant, comment puis-je faire pour créer des instances de toutes les classes? p>
Je sais que je peux utiliser c.getconstructor (classe) .Newinstance (paramètres) pour créer des instances de classes qui n'ont pas de "constructeur de paramètres vide", mais je ne connais pas les paramètres de chaque classe. P >
Une dernière chose, toutes ces classes s'étendent d'une autre classe appelée parentclass, alors une solution de contournement que je pourrais utiliser est d'inclure du code dans le parentclass qui oblige la classe enfant à mettre en œuvre un "constructeur de paramètres vide", mais ne Savoir comment faire cela. P>
Merci d'avance! p>
3 Réponses :
Vous pouvez appeler classe.geconstructeurs () < / a> Pour obtenir tous les constructeurs pour une classe donnée. P>
sur chaque constructeur , vous pouvez appeler constructor.getgenericParameTypeTypes () pour apprendre lequel paramètres il attend. p>
Vous ne pouvez pas. Il n'ya aucun moyen de "exiger" un constructeur sans paramètre et d'avoir appliqué par le compilateur et par définition pour créer une instance d'une classe, vous devez le fournir avec les paramètres nécessaires, ou sinon vous serrez avec un objet qui enfreint le Contrat de classe (car il n'est pas initialisé correctement).
Le moyen approprié de l'appliquer à un niveau de code est avec une usine d'objet et des interfaces. Je suppose que vous devez utiliser la réflexion parce que vous ne connaissez pas les types à l'heure de la compilation; Dans ce cas, il devrait également y avoir une "usine" qui sait produire des instances de chaque type. Cette usine doit être construite / compilée avec le type en question, de sorte qu'elle est au courant et peut invoquer le constructeur approprié. L'usine implémente ensuite une interface que votre code est conscient, tel que "ObjectFactory", qui vous permet de déléguer à l'usine d'instanciation d'objets. Vous auriez alors une méthode qu'une usine d'objet peut utiliser pour s'inscrire comme étant responsable de tous les types qu'il peut instancier. P>
dans le code qui navère avec les classes que vous essayez de créer: p> et dans votre code: p> (où vous avez une interface code> usine code> Vous ne savez pas ce que Alternativement, vous pouvez simplement exiger que les auteurs de n'importe quel code que votre framework soit chargé de manière dynamique d'un constructeur sans argument. Ce n'est pas exécuté de manière rigide, mais peut être plus facile pour les auteurs de mettre en œuvre. P> p> typeFactory code> implémente et spécifie la méthode
NewInstance code>) p>
inconnuClass code> est ou comment l'instancier, mais si le code Cela est venu avec cette classe enregistré une usine, vous pouvez interroger pour cette usine et lui demander de créer l'objet pour vous. Si
inconnuClass code> est vraiment
typea.class code>, alors le registre retournera le
typeAfactory code> enregistré pour créer des objets. P>
Il existe deux méthodes de réflexion pour créer des instances de classes forts>: classe.Newinstance () ne peut qu'invoquer le constructeur zéro-argument fort>, tandis que p>
constructeur.newinstance () peut invoquer tout constructeur, quel que soit le nombre de paramètres forts>. p> java.lang.reflect.constructor.newinstance () code> et
classe.Newinstance () Code> p>
La plupart des principaux cadres qui s'appuient sur la réflexion pour créer des objets ont une règle que tout doit avoir un constructeur de no-args qui n'est pas "appliqué" de quelque manière que ce soit dans le code, il suffit de savoir que vous devez l'inclure.