Instancier une classe depuis un fichier *.class [Résolu]

Signaler
Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012
-
 Utilisateur anonyme -
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

Messages postés
130
Date d'inscription
mercredi 2 janvier 2002
Statut
Membre
Dernière intervention
7 juillet 2012

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
Messages postés
600
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
8 juillet 2016
8
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...

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.)

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.)