IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Acceder aux constructeurs de classes implementant une interface


Sujet :

avec Java

  1. #1
    Membre averti
    Avatar de Heavy Metal Hero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2007
    Messages : 152
    Points : 333
    Points
    333
    Billets dans le blog
    13
    Par défaut Acceder aux constructeurs de classes implementant une interface
    Bonojour,
    Dans le cadre d'une application Swing, je dois pouvoir charger des plugin.jar. Les plugin contienent une interface et des classes implementant cette interface. Le fait est que je ne connait pas a l'avance le nom des classes du .jar mais juste l'interface.

    Voila le code de l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface IPlugin
    {
    	public BufferedImage perform (BufferedImage img);
    	String getName();
    }
    Chacune des classes implemente donc une fonction perform et getname.
    Le probleme est que seul un objet de type IPlugin peut appeler la fonction perform, et j'ai besoin de l'instancier avec le constructeur de la classe correspondante.
    J'utilise cette fonction pour charger les classes du jar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void getClassFromJar(String pathToJar) throws IOException, ClassNotFoundException{
    		JarFile jarFile = new JarFile(pathToJar);
    		Enumeration e = jarFile.entries();
     
    		URL[] urls = { new URL("jar:file:" + pathToJar+"!/") };
    		URLClassLoader cl = URLClassLoader.newInstance(urls);
     
    		while (e.hasMoreElements()) {
    			JarEntry je = (JarEntry) e.nextElement();
    			if(je.isDirectory() || !je.getName().endsWith(".class")){
    				continue;
    			}
    			String className = je.getName().substring(0,je.getName().length()-6);
    			className = className.replace('/', '.');
    			IPlugin c = cl.loadClass(className);
    			addClass(className, cl.loadClass(className));
    		}
    Il y a une erreur a l'avant derniere ligne, le compilateur veut que ce soit une classe et non un IPlugin qui soit le type de c. De plus je ne peux acceder aux fonctions des mes classes que si le type de l'objet est un IPlugin, il faut donc imperativement que c soit IPlugin.

    Mes questions sont donc :
    Comment recuperer exclusivement des objets de type IPlugin de mon .jar sans que le compilateur detecte une erreur ?
    Comment reconnaitre le nom des classes et des constructeurs pour instancier mon objet IPlugin automatiquement avec la classe qui lui est donne ?
    Merci d'avance

  2. #2
    Membre averti
    Avatar de Heavy Metal Hero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2007
    Messages : 152
    Points : 333
    Points
    333
    Billets dans le blog
    13
    Par défaut
    J'ai trouve mon probleme. Il suffit de remplacer les deux dernieres lignes de mon jarLoader par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Class<?> c = cl.loadClass(className);
    IPlugin i = (IPlugin)c.newInstance();
    addClass(className, i);
    On peut ainsi caster et creer directement une instance de IPlugin, on peut donc directement utiliser les fonctions perform de chaque classe.

  3. #3
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Avec un métro de retard, mais avec un tout petit plus de détails :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class<?> loadedClass = cl.loadClass(className);
    if (IPlugin.class.isAssignableFrom(loadedClass)) {
    	try {
    		addClass(className, (IPlugin) loadedClass.newInstance());
    		// Ou bien : loadedClass.getConstructors()[...].newInstance(...);
    	} catch (InstantiationException | IllegalAccessException exception) {
    		throw new RuntimeException(exception);
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Delaration d'un objet dont sa classe implemente une Interface
    Par handsome01 dans le forum Général Java
    Réponses: 2
    Dernier message: 02/11/2012, 03h20
  2. [REFLEXION] Connaitre toutes les classes qui implémentent une interface
    Par narmataru dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 25/10/2006, 11h00
  3. [Reflection] Obtenir toutes les classes implémentant une interface
    Par Pill_S dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 20/04/2005, 16h48
  4. [classe anonyme] implementant une interface
    Par stanilas dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2004, 00h18
  5. [Reflection] Classes implémentant une interface
    Par thibaut dans le forum API standards et tierces
    Réponses: 17
    Dernier message: 29/07/2004, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo