Salut,
Afin de faire un system de plugin pour mon appli et en utilisant un URLClassLoader pour chaque plugin. Pour cela j'override le system property java.system.class.loader et en utilisant mon propre SystemClassLoader avec en autre la autre la fct loadClass():
classLoaders est une liste de PluginClassLoader.
Ca marche bien mais je me demande juste si il n'y a pas une facon plus efficace. Et surtout ca ne correspond pas au model de delegation de Java2. Au lieu de deleguer en remontant je delegue en redescendant.
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
18
19
20
21
22
23 public class MySystemClassLoader extends ClassLoader{ private List classLoaders; public MySystemClassLoader parent) throws MalformedURLException, IOException{ super(parent); classLoaders = initClassLoaders(); } public Class loadClass(String name, boolean resolve) throws ClassNotFoundException { PluginClassLoader cl=null; // extends URLClassLoader try { return super.loadClass(name, resolve); } catch (ClassNotFoundException ex) {} for (Iterator i = classLoaders.iterator(); i.hasNext(); ) { cl = (PluginClassLoader)i.next(); try { return cl.loadClass(name); } catch (ClassNotFoundException ex) {} } throw new ClassNotFoundException(name); } }
La hierarchie des mes ClassLoader est la suivante.
BootstrapClassLoader
.............|
ExtensionClassLoader
.............|
SystemClassLoader
|............|..............|
Plugin1 Plugin2 Pluginx
Je suppose que tomcat utilise ce genre de principe donc si qq un sait comme ca marche chez les pros ou alors a une bonne idee je serai bien content.
Merci
Partager