2012-01-13 6 views
-1

Je l'interface suivanteCréer un objet d'une interface par chaîne

package test.test; 

public interface IMyInterface { 
public String hello(); 
} 

et une mise en œuvre

package test.test.impl; 

public class TestImpl implements IMyInterface { 
public String hello() { return "Hello"; } 
} 

J'ai donc que la chaîne complète "test.test.impl.TestImpl". Comment puis-je charger la classe et créer un objet à partir de l'implémentation? Je vais utiliser le Classloader actuel mais je n'ai aucune idée de créer un objet.

Class<?> i = getClass().getClassLoader().loadClass("test.test.impl.TestImpl"); 
IMyInterface impl = null; 

Merci pour votre aide!

Répondre

1
Class<?> clazz = .... 
Object o = clazz.newInstance(); 
// o will be a valid instance of you impl class 

Il appellera le constructeur par défaut (vous devez en avoir un!).

2

Utiliser la réflexion:

TestImpl ti = (TestImpl) Class.forName("test.test.impl.TestImpl").newInstance(); 
+0

ajouter le casting :) – helios

2

Useimpl = (IMyInterface) i.getConstructor().newInstance();

4

Avec Class.newInstance. L'inconvénient de cette approche est, cependant, qu'elle supprime les exceptions vérifiées (et introduit de nouvelles exceptions liées à la réflexion) et toujours no-arg.
Vous pouvez également utiliser Class.getConstructor (puis Constructor.newInstance), de cette façon vous pouvez fournir les arguments, mais le problème d'exception est toujours présent.

+0

Que voulez-vous dire par "toujours sans arg"? Vous pouvez instancier une nouvelle instance avec des arguments/paramètres comme ceci: Object obj = klass.getConstructor (parameterTypes) .newInstance (parameterArr); – bchetty

+0

EDIT: Désolé, j'ai mal lu votre commentaire. :) – bchetty

+0

Certes, j'aurais pu l'écrire plus propre. Class.newInstance est no-arg, mais Constructor.newInstance est paramétrable. – zeller

Questions connexes