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

Langage Java Discussion :

Problème avec classLoader et classe interne


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse.

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

    Ça marche très bien avec un URLClassLoader.

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

Discussions similaires

  1. Problème avec vector de classe template :(
    Par coyotte507 dans le forum Langage
    Réponses: 7
    Dernier message: 16/04/2008, 13h40
  2. Problème avec une sous classe de Graphics2D
    Par Virgile le chat dans le forum 2D
    Réponses: 1
    Dernier message: 16/06/2007, 03h59
  3. Problème avec AfxBeginThread et classe managée
    Par AurélienB dans le forum MFC
    Réponses: 2
    Dernier message: 11/12/2006, 16h30
  4. Problème avec l'attribut class
    Par Marty000 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 20/11/2006, 09h51
  5. Problème d'accés et classe interne.
    Par Pragmateek dans le forum C++
    Réponses: 8
    Dernier message: 14/08/2006, 14h34

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