2012-05-23 5 views
1

Considérez la méthode simple suivante que (tentatives de) charge toutes les classes d'un nom spécifique, résidant dans un fichier JAR situé dans un chemin d'accès spécifié, à savoirchargement dynamique des classes à partir de plusieurs fichiers JAR

public static List<Class<?>> getAllClasses(String name, String path) 
{ 
    File file = new File(path); 

    try 
    { 
     URL url = file.toURI().toURL(); 

     URLClassLoader loader = URLClassLoader.newInstance(new URL[] {url}); 

     JarFile jar = new JarFile(file); 

     Enumeration<JarEntry> entries = jar.entries(); 

     Class<?> type; 

     String elementName; 

     List<Class<?>> classList = new ArrayList<Class<?>>(); 

     while (entries.hasMoreElements()) 
     { 
      elementName = entries.nextElement().getName(); 

      if (elementName.equals(name)) 
      { 
       try 
       { 
        type = loader.loadClass(elementName); 
        classList.add(type); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
     } 

     return classList; 
    } 
    catch (Exception e) 
    { 
    } 

    return null; 
} 

S'il y a plus 1 JAR dans le chemin, dont chacun a au moins une classe avec un nom canonique identique avec une classe déjà chargée, par ex. org.whatever.MyClass, est-il possible, sans les chargeurs de classe personnalisés, de charger toutes les classes org.whatever.MyClass?

Répondre

1

Les chargeurs de classe standard chargent des classes dans un seul espace de noms. Si vous recherchez des instances d'une même classe à partir d'implémentations de versions différentes, vous devez utiliser des chargeurs de classe personnalisés. Votre extrait de code est un exemple de chargement personnalisé.

Vous pouvez vous référer à un article détaillé publié here.

1

Aucune classe n'est chargée une seule fois et la clé de la classe est Classloader + nom de classe entièrement qualifié. Il vérifiera le cache et la chaîne du chargeur de classe et s'il trouve la classe, il ne tentera pas de le charger à nouveau. Lequel est choisi est spécifique à la mise en œuvre.

Questions connexes