Vous demanderez probablement, pourquoi voudrais-je faire cela - c'est parce que j'utilise une classe (d'une bibliothèque externe) qui contient des choses dans son initialisateur statique et que je dois savoir si cela a été fait ou non. p>
J'ai regardé classloader code>, mais je n'ai rien trouvé qui avait l'air utile. Des idées? P>
7 Réponses :
Pourquoi ne faites-vous pas simplement référence à la classe (en créant une référence, créant une instance, ou accédant à un membre statique)? Cela lancera l'initialiseur de type si elle n'a pas déjà été tirée et si elle vous trouvait toujours bien d'y aller. P>
Étant donné que cette bibliothèque lit les paramètres avec system.geproperty code> et j'ai besoin de savoir si je peux toujours les changer ou non.
Vous pouvez utiliser le AVERTISSEMENT STRUT>: Ce code ne fonctionne pas vraiment ici, dans le chargeur de système de système, vérifier le lien ci-dessous sur le même sujet strong> pour vérifier si une classe est Chargé avec le chargeur de classes système EM> P> Classloader.FindOWLoaderClass () code> méthode. S'il renvoie NULL, la classe n'est pas chargée. De cette façon, vous ne chargez pas la classe si ce n'était pas déjà chargé.
FindOCLass () code> est protégé, vous devez le remplacer par votre propre chargeur de classe. P>
if(ClassLoader.getSystemClassLoader().findLoadedClass("java.lang.String") != null){
System.out.println("Yepee, String is loaded !");
}
N'a pas cette cause chaîne code> à charger lorsque vous appellez la méthode appeler car il doit évaluer la chaîne
string code> littéral
"java.lang.string" code " code >?
Eh bien, le code ne fonctionne pas vraiment du tout, nous ne pouvons pas appeler FindroclassClass () sur le chargeur de classe par défaut. Alors considérez cela comme un exemple simple.
Bien sûr, un exemple simple artificiel, mais néanmoins, votre si code> est toujours évaluée à
vrai code>?
Eh bien, si cela fonctionnerait, il serait toujours true code> (ou exploser dans une classe de classeNotFoundException depuis la chaîne littérale ne serait pas compréhensible: p).
"Chargé" ne signifie pas "initialisé". L'initialisation ne se produit que dans des moments précis définis par JLS3 12,4,1 $
Vous pouvez obtenir le JVM pour imprimer des cours car il les charge, à l'aide du drapeau -verbose. Cela pourrait vous aider.
java -verbose Dummy|head [Opened C:\Program Files\Java\jre6\lib\rt.jar] [Loaded java.lang.Object from C:\Program Files\Java\jre6\lib\rt.jar] [Loaded java.io.Serializable from C:\Program Files\Java\jre6\lib\rt.jar] [Loaded java.lang.Comparable from C:\Program Files\Java\jre6\lib\rt.jar] [Loaded java.lang.CharSequence from C:\Program Files\Java\jre6\lib\rt.jar] [Loaded java.lang.String from C:\Program Files\Java\jre6\lib\rt.jar]
Vous pouvez essayer quelque chose comme ceci: p>
classe c = nouveau chargeur de classes () {Classe C = FindrodClass (Nom de classe); } .c; p>
Class.forName("com.abc.Xyz", true, this.getClass().getClassLoader()) It will block until the class has been initialized (by itself or some other thread)
Si ce n'est pas trop tard. Cela devrait fonctionner bien aussi
Class.forName().newInstance();
Remarque: Ceci sera seulement i> fonctionner s'il existe un constructeur sans paramètre disponible. Ce n'est pas toujours le cas (si vous définissez un ou plusieurs constructeurs avec des paramètres, mais ne définissez pas explicitement un constructeur sans paramètre également).
Je sais que c'est très tard, mais je pense que cette réponse pourrait être utile. Si vous n'êtes pas trop effrayé (et que vous êtes autorisé) d'utiliser la classe retour sun.misc.unsafe code> Il existe une méthode qui précisément em> est-ce que: la méthode
true code> si et seulement si la classe
indiquée sous condition de paramètre est (chargé mais) non initialisée. p> p>
Vous voulez dire «si une classe est initialisée». Il y a une énorme différence.
Merci d'avoir fait remarquer cela. J'ai changé le titre.
Quelle bibliothèque? Il y a peut-être un effet secondaire que vous pourriez vérifier (par exemple, les pilotes JDBC s'inscrivent dans le DriverManager).
C'est une bibliothèque utilisée en interne en compagnie pour laquelle je travaille. Merci pour un indice, je trouverai peut-être quelque chose.