2010-09-25 29 views
3

Je dois une situation où je dois charger une classe nommée. S'il y a plusieurs classes avec le même nom (par exemple, com.example.myclass) dans mon chemin de classe, je dois charger les deux. J'utilise la méthode 'loadClass()' de ma classe CustomLoader qui dérive de java.lang.ClassLoader. Je n'ai pas changé le comportement de la classe parente mais j'appelle simplement les méthodes du parent. Mon problème est que s'il y a deux classes avec le même nom, je ne peux en charger qu'une seule. J'ai scanné le web pour trouver une solution mais je n'en ai trouvé aucun. J'ai trouvé de nombreuses solutions sur les classes de rechargement en créant une nouvelle instance de chargeur de classe mais dans mon cas, la nouvelle instance finira probablement par recharger la première classe. Ce problème peut-il être résolu?résoudre les conflits de nom de classe dans Java

EDIT: J'ai oublié de mentionner que les deux classes avec le même nom sont dans différents fichiers jar.

EDIT: Jon et Stephen ont tous deux donné la même solution mais je ne peux en marquer qu'un comme réponse. Désolé :(J'ai voté les deux réponses cependant

Répondre

6

I Je crois que la bibliothèque JVM et la bibliothèque de classes supposent qu'un nom de classe est unique au sein d'un chargeur de classe, donc si vous voulez charger le même nom de classe pour différentes classes, vous aurez besoin de différents classloaders (par exemple, un pour chaque fichier jar).

leur utilisation pourrait être difficile, mais c'est le genre de problème que vous obtenez avec ce genre de chose.

+0

Je suis nouveau à Java. Pouvez-vous expliquer ce que vous voulez dire par un chargeur de classe pour chaque pot? Comment puis-je spécifier un chargeur de classe différent pour chaque pot? – 341008

+1

@Rajorshi: Vous devrez créer une nouvelle instance de (par exemple) URLClassLoader en vous référant à chaque fichier jar, et demander à chaque instance de charger la classe. Mais pour être honnête, si vous êtes nouveau sur Java, je commencerais à essayer ce genre de chose pendant un moment. Je suggère même qu'un développeur Java expérimenté devrait essayer d'éviter de se retrouver dans cette situation si possible. –

+0

Merci pour le conseil. Je ne peux pas vraiment refuser d'implémenter ce module, mais les développeurs Java supérieurs vont revoir le code. Si quelque chose me manque, ils devraient pouvoir le détecter. – 341008

4

l'API classloader n'a aucun moyen de spécifiez laquelle des deux classes portant le même nom que celle que votre application tente de charger:

Vous devrez configurer deux chargeurs de classe différents avec des chemins de classes différents. Ensuite, vous devrez charger les classes en appelant la méthode loadClass(String) sur les chargeurs de classe respectifs.

Il y a un certain nombre de "getchas" à faire ce genre de chose. L'un d'entre eux est que les types des instances des classes respectives seront différents, et les types de données d'un type à l'autre échoueront.

+0

Malheureusement, il n'est pas possible de configurer les chemins de classes lors de l'exécution. – 341008

+3

@Rajorshi - oh oui c'est! Voir http://download.oracle.com/javase/6/docs/api/java/net/URLClassLoader.html –

0

Je suggère qu'il ya quelque chose de grave avec le problème ici. Comment un tel état de choses peut-il arriver en premier lieu? Il y a quelque chose qui ne va pas dans un processus de développement qui peut produire des classes dupliquées en premier lieu.

Ou est-ce le problème que cela tente de résoudre? Ou diagnostiquer?

+0

Il s'agit d'un framework de plug-in qui attend que tous les tiers soient présents dans un dossier particulier. Le plugin peut être écrit par n'importe qui et donc nous ne pouvons pas garantir qu'il n'y aura pas d'affrontements. – 341008

+1

Ensuite, je vous suggère de faire une règle qu'ils utilisent com.mycompany.whatever dans leurs noms de paquets comme recommandé pour toute la programmation Java, et déclinent toute responsabilité s'ils ne l'observent pas. – EJP