2010-08-26 6 views
48

Je voudrais instancier un objet à partir de son objet Class, en utilisant le constructeur qui accepte un seul argument String.Instancier un objet de classe avec un constructeur qui accepte un paramètre de chaîne?

Voici un code que les approches de ce que je veux:

Object object = null; 
Class classDefinition = Class.forName("javax.swing.JLabel"); 
object = classDefinition.newInstance(); 

Cependant, il instancie l'objet JLabel sans texte. Je voudrais utiliser le constructeur JLabel qui accepte une chaîne comme texte initial. Existe-t-il un moyen de sélectionner un constructeur spécifique à partir d'un objet Class?

Répondre

75

Class.newInstance appelle le constructeur sans arg (celui qui ne prend pas de paramètres). Pour appeler un constructeur différent, vous devez utiliser le package de réflexion (java.lang.reflect).

obtenir une instance Constructor comme ceci:

Class<?> cl = Class.forName("javax.swing.JLabel"); 
Constructor<?> cons = cl.getConstructor(String.class); 

L'appel à getConstructor spécifie que vous voulez que le constructeur qui prend un seul paramètre String. Maintenant, pour créer une instance:

Object o = cons.newInstance("JLabel"); 

Et vous avez terminé.

P.S. N'utilisez la réflexion qu'en dernier recours!

8

Ce qui suit travaillera pour vous. Essayez ceci,

Class[] type = { String.class }; 
Class classDefinition = Class.forName("javax.swing.JLabel"); 
Constructor cons = classDefinition .getConstructor(type); 
Object[] obj = { "JLabel"}; 
return cons.newInstance(obj); 
2

Class.forName("className").newInstance() appelle toujours le constructeur par défaut sans argument.

Pour appeler le constructeur paramétrisé au lieu de zéro argument ne-arg constructeur,

  1. Vous devez obtenir Constructor avec les types de paramètres par types passant dans Class[] pour getDeclaredConstructor méthode de Class
  2. Vous devez créer constructeur instance en transmettant les valeurs en Object[] pour
    newInstance méthode de Constructor

code Exemple:

import java.lang.reflect.*; 

class NewInstanceWithReflection{ 
    public NewInstanceWithReflection(){ 
     System.out.println("Default constructor"); 
    } 
    public NewInstanceWithReflection(String a){ 
     System.out.println("Constructor :String => "+a); 
    } 
    public static void main(String args[]) throws Exception { 

     NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance(); 
     Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor(new Class[] {String.class}); 
     NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"}); 

    } 
} 

sortie:

java NewInstanceWithReflection 
Default constructor 
Constructor :String => StackOverFlow 
Questions connexes