6
votes

Java - Créez une nouvelle instance à l'aide de la réflexion sans connaître les paramètres du constructeur

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.

Maintenant, comment puis-je faire pour créer des instances de toutes les classes?

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.

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.

Merci d'avance!


1 commentaires

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.


3 Réponses :



3
votes

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.

dans le code qui navère avec les classes que vous essayez de créer: xxx

et dans votre code: xxx

(où vous avez une interface usine typeFactory implémente et spécifie la méthode NewInstance )

Vous ne savez pas ce que inconnuClass 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 est vraiment typea.class , alors le registre retournera le typeAfactory enregistré pour créer des objets.


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.


0 commentaires

2
votes

Il existe deux méthodes de réflexion pour créer des instances de classes : java.lang.reflect.constructor.newinstance () et classe.Newinstance ()

classe.Newinstance () ne peut qu'invoquer le constructeur zéro-argument , tandis que

constructeur.newinstance () peut invoquer tout constructeur, quel que soit le nombre de paramètres .


0 commentaires