Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/12/2012, 17h24   #1
croquette06
Invité de passage
 
Inscription : janvier 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 9
Points : 3
Points : 3
Par défaut Problème avec classLoader et classe interne

Bonjour,

Pour un projet j'ai du créer un classLoader me permettant de charger des modules à chaud. Cependant j'ai un problème avec l'un des modules qui utilise des classes internes anonymes pour les listener.


Code :
1
2
3
4
5
6
7
8
9
Exception in thread "main" java.lang.IllegalAccessError: tried to access class ModuleFormule.ModuleFormule$1 from class ModuleFormule.ModuleFormule
	at ModuleFormule.ModuleFormule.<init>(ModuleFormule.java:77)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at java.lang.Class.newInstance0(Unknown Source)
	at java.lang.Class.newInstance(Unknown Source)
	at base.PluginLoader.main(PluginLoader.java:47)
Voici le PluginLoader. Il contient un petit main pour tester.
C'est au niveau du newInstance que l'exception est levée.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.io.IOException;
import java.io.InputStream;
import java.security.SecureClassLoader;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
 
public class PluginLoader extends SecureClassLoader {  
 
	private String repertoirePlugins = "C:\\javatest\\Module\\";
 
 
	public Class<?> findClass(String name) throws ClassNotFoundException {  
		System.out.println("name : "+name);
		byte[] b = loadClassData(name);  
		return super.defineClass(name+"."+name, b, 0, b.length);  
	}  
 
	private byte[] loadClassData(String name) {
 
		try {
 
			JarFile zf = new JarFile(repertoirePlugins+name+".jar");
			ZipEntry entry = zf.getEntry(name+"/"+name+".class");
			System.out.println(entry.getName());
			InputStream is = zf.getInputStream(entry);
 
			byte[] tab = new byte[is.available()];
			is.read(tab);
			return tab; 
 
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
		return null;
 
 
	}
 
	public static void main(String[] args){
		PluginLoader pl = new PluginLoader();
		try {
			Class c = pl.findClass("ModuleFormule");
			IModule mod = (IModule)c.newInstance();
			System.out.println(mod.getClass().getDeclaredMethods());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
 
}
Si quelqu'un a une solution je suis preneuse.

Merci d'avance !
croquette06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 21h39   #2
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 287
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 287
Points : 32 766
Points : 32 766
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Je ne suis pas sur (pas expert dans le fonctionnement interne des classloader) que ta technique de surchargr defineClass soit bonne.

Si tu veux charger tes classes depuis des jar, le mieux c'est quand même de prendre directement une URLClassLoader. En plus, ton implémentation ne fait pas une opération fondamentale: déléguer au classloader parent. Il n'y a aucune notion de classloader parent. Donc il va merdouiller dès qu'on va lui demander une classe base de la JRE.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 00h01   #3
croquette06
Invité de passage
 
Inscription : janvier 2011
Messages : 9
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 9
Points : 3
Points : 3
Merci pour ta réponse.

J'ai laissé tombé notre pseudo classLoader fait en Tp.

Ça marche très bien avec un URLClassLoader.
croquette06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h55.


 
 
 
 
Partenaires

Hébergement Web