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 :
Chacune des classes implemente donc une fonction perform et getname.
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(); }
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 :
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.
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)); }
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
Partager