2010-08-19 3 views
1

J'ai une méthodeComment puis-je obtenir une instance par une classe?

public static <T> T createObject(Class<T> t){ 

} 

Vous voyez, je veux obtenir une instance de T.

Je sais que cela peut être réalisé, parce que:

public <T> T find(Object id, Class<T> type) { 
    return (T) this.em.find(type, id); 
} 

Aide-moi ... .....

Répondre

2

siunds comme vous avez besoin de réflexion

 
import java.reflect.*; 
... 
Class klass = obj.class; 
Object newObj = klass.newInstance(); 
return (T)newObj; 

note: écrit de mémoire, donc l'API peut être légèrement différente.

+1

L'importation n'est pas nécessaire, vous n'utilisez quoi que ce soit à partir de là. Tout ce dont vous avez besoin est une méthode: Class.newInstance(). –

3

Si la classe t a un constructeur sans args, la méthode Class.newInstance() fera ce qui est nécessaire:

public static <T> T createObject(Class<T> t) 
throws InstantiationException, IllegalAccessException { 
    return t.newInstance(); 
} 

Notez que vous devez soit propager ou faire face à des exceptions vérifiés résultant des choses comme:

  • l'objet t représente une interface ou une classe abstraite,
  • la classe t ne dispose pas d'un constructeur sans args, ou
  • la classe t ou son constructeur no-args ne sont pas accessibles.
1

Si vous voulez gérer les paramètres, vous pouvez le faire:

public static <T> T instantiate(Class<T> clazz, Object ... parameters) throws Exception { 
    Validate.notNull(clazz, "Argument null pour 'classe' !"); 
    if (!ArrayUtils.isEmpty(parameters)) { 
     Class<?> [] parametersType = new Class<?>[parameters.length]; 
     for(int i=0 ; i<parameters.length ; i++) { 
      parametersType[i] = parameters[i].getClass(); 
     } 
     return clazz.getConstructor(parametersType).newInstance(parameters); 
    } 
    return clazz.newInstance(); 
} 
Questions connexes