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

cs_Tibabou 130 Messages postés mercredi 2 janvier 2002Date d'inscription 7 juillet 2012 Dernière intervention - 24 avril 2012 à 22:36 - Dernière réponse :  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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_Tibabou 130 Messages postés mercredi 2 janvier 2002Date d'inscription 7 juillet 2012 Dernière intervention - 26 avril 2012 à 22:34
3
Merci
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

Merci cs_Tibabou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de cs_Tibabou
cormandyr 600 Messages postés samedi 20 mai 2006Date d'inscription 8 juillet 2016 Dernière intervention - 25 avril 2012 à 08:09
0
Merci
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...
Commenter la réponse de cormandyr
Utilisateur anonyme - 26 avril 2012 à 21:47
0
Merci
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.)
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 5 mai 2012 à 00:26
0
Merci
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.)
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.