Est-ce que quelqu'un sait comment découvrir par programmation d'où le chargeur de classe Java charge réellement la classe?
Je travaille souvent sur de gros projets où le chemin des classes devient très long et la recherche manuelle n'est pas vraiment une option. J'ai récemment eu un problème où le classloader chargeait une version incorrecte d'une classe car il était sur le chemin de classe à deux endroits différents.
Alors, comment puis-je faire en sorte que le chargeur de classe me dise d'où vient le fichier de classe réel sur le disque?
Edit: Qu'en est-il si le chargeur de classe ne parvient pas à charger la classe en raison d'une incompatibilité de version (ou autre chose), est-il possible de savoir quel fichier il essaie de lire avant de le lire?
Réponses:
Voici un exemple:
Ceci a imprimé:
la source
Test.class.getResource("Test.class")
qui ne répète pas le nom du paquet.Test.class.getResource(Test.class.getSimpleName() + ".class")
BouncyCastleProvider
nom complet du paquet est nécessaire cependant.getClassLoader()
de revenirnull
. Voir ici pour une extension de cette méthode pour gérer cela.Une autre façon de savoir à partir de laquelle une classe est chargée (sans manipuler la source) consiste à démarrer la machine virtuelle Java avec l'option:
-verbose:class
la source
la source
Voici ce que nous utilisons:
Cela fonctionnera en fonction de l'implémentation de ClassLoader:
getClass().getProtectionDomain().getCodeSource().getLocation()
la source
La version de Jon échoue lorsque l'objet
ClassLoader
est enregistré commenull
ce qui semble impliquer qu'il a été chargé par BootClassLoader
.Cette méthode traite ce problème:
la source
Modifier seulement la 1ère ligne:
Main
.classProduction:
Peut-être mauvais style mais fonctionne bien!
la source
En règle générale, nous ne savons pas quoi utiliser le codage en dur. Nous pouvons d'abord obtenir className, puis utiliser ClassLoader pour obtenir l'URL de la classe.
la source
Jetez un œil à cette question similaire. Outil pour découvrir la même classe.
Je pense que l'obstacle le plus pertinent est si vous avez un classloader personnalisé (chargement depuis une base de données ou un ldap)
la source
Manière simple:
Exemple de sortie:
Ou
Exemple de sortie:
la source
Cette approche fonctionne pour les fichiers et les fichiers JAR:
la source
En supposant que vous travaillez avec une classe nommée
MyClass
, ce qui suit devrait fonctionner:Le fait que vous puissiez ou non obtenir l'emplacement sur le disque du fichier .class dépend du chargeur de classe lui-même. Par exemple, si vous utilisez quelque chose comme BCEL, une certaine classe peut même ne pas avoir de représentation sur disque.
la source