2 votes

Créer un nouvel objet en utilisant string comme nom de classe

Existe-t-il un moyen de convertir une chaîne de caractères en nom de classe pour l'utiliser comme le code ci-dessus (j'ai essayé d'utiliser Class.forName mais cela n'a pas fonctionné) ?

Class c = Class.forName("SportCar");
c car= new c();     
System.out.println(car.getCost());

3voto

Debmalya Biswas Points 1969

Vous pouvez utiliser :

Class<?> clazz = Class.forName(className);
Car car = (Car) clazz.newInstance();

Si vous avez un constructeur paramétré dans la classe, faites quelque chose comme

Class<?> clazz = Class.forName(className);
clazz.newInstance();
Constructor<?> constructor = clazz.getConstructor(String.class); 
Car object = (Car) constructor.newInstance(new Object[] { someArgument}); // constructor args

2voto

Alberto Points 399

Vous devez appeler newInstance méthode :

Class<SportCar> c = (Class<SportCar>) Class.forName("package.to.SoprtCar");
SportCar car = c.newInstance();     
System.out.println(car);

0voto

Marcus Lanvers Points 87

Obtenir le type de classe à partir d'une chaîne de caractères

assurez-vous d'avoir le nom complet de la classe comme com.mycompany.MyClass lorsque vous utilisez la méthode for Name.

0voto

Joop Eggen Points 30166

Vous pouvez créer un objet portant le nom de classe SportCar . Bien qu'il s'agisse d'une méthode très coûteuse pour la création d'objets, l'utilisation de la réflexion.

Et en fait vous souhaitez utiliser certaines fonctionnalités de SportCar à savoir la méthode getCost .

interface Costly { BigDecimal getCost(); }

class SportCar implements Costly { ... }

Class c = Class.forName("SportCar");
Costly car= (Costly) c.newInstance();     
System.out.println(car.getCost());

Il existe de meilleurs modèles de code, moins artificiels, pour quelques cas d'utilisation différents.

Ici, on peut utiliser un modèle d'usine pour recevoir un SportCar (ou Costly). Pour les extensibilité où une application, avec l'ajout d'une ou plusieurs bibliothèques de classes encore inconnues, reçoit une classe d'implémentation d'une interface, java SPI (interface fournisseur de services) peut être utilisé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X