Instancier une classe depuis un fichier *.class

Résolu
cs_Tibabou Messages postés 129 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012 - 24 avril 2012 à 22:36
 Utilisateur anonyme - 5 mai 2012 à 00:26
Bonjour,

Je dispose d'un fichier A.class correspondant à une classe java compilée. La classe A implémente une interface I.

J'ai un programme P qui connaît la déclaration de I et qui doit instancier A.

J'ai cherché du côté de la réflexion mais sans succès.
Avez-vous une idée ?

Merci d'avance.
Tibabou

4 réponses

cs_Tibabou Messages postés 129 Date d'inscription mercredi 2 janvier 2002 Statut Membre Dernière intervention 7 juillet 2012
26 avril 2012 à 22:34
Merci à vous 2 pour votre aide.

J'ai aussi trouvé quelque chose qui semble fonctionner. J'ai écrit une classe "MyClassB" dont le *.class se trouve dans F:\MonDossier et j'exécute ceci :

URL[] urls = new URL[]{new URL("file:\\F:\\MonDossier\")};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("MyClassB");
Object instB = cls.newInstance();

"instB" contient bien une instance de ma classe.

Pour ce qui est de la réflexion Pylouq, tu peux jeter un oeil aux sites parlant d'introspection ou de réflexivité.

Merci encore !
++

Tibabou
3
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
25 avril 2012 à 08:09
Salut,

Tu as plusieurs moyen d'instancier une classe...
Soit directement avec le new.... soit ClassLoader.getSystemClassLoader().loadClass(...).newInstance() où tu donnes la classe à instancier (org.xxx.A par exemple) ou encore Class.forName("org.xxx.A").newInstance()

Attention que pour les deux dernières, le constructeur par défaut doit exister.

Il y a peut-être d'autre moyen, mais comme ça il ne me vienne pas à l'esprit...
0
Utilisateur anonyme
26 avril 2012 à 21:47
GenerateurTradPos generateur = (GenerateurTradPos)Class.forName( PACKAGE_GEN_TRAD_POS + args[1] ).newInstance();

J'ai cherché du côté de la réflexion mais sans succès.

Réflexion ? C'est à dire ?

Personnellement, j'ai déjà été amené à faire quelque chose de très similaire, et je suis passé par le deuxième façon de faire dite par cormandyr .
Au final, ça donnait quelque chose comme ça :

MonInterface monObjet  = (MonInterface) Class.forName( package + nomFichier ).newInstance();


La différence avec ce que tu veux, c'est que là je passe un chemin avec un nom de classe, et non pas le fichier .class lui même. De mémoire, je crois qu'en paramètre c'est le nom du .class et .java. Essaye de cette façon et donne nous des nouvelles.

--
Pylouq
(Lire le Réglement n'a jamais tué personne, au pire ça a instruit des gens.)
0
Utilisateur anonyme
5 mai 2012 à 00:26
Je n'avais pas compris le termer réflefxion comme le terme réflexivité, d'où mon interrogation^^

Bon dev

--
Pylouq
(Lire le Réglement n'a jamais tué personne, au pire ça a instruit des gens.)
0
Rejoignez-nous