11
votes

Comment vérifier si une classe est initialisée?

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.

J'ai regardé classloader , mais je n'ai rien trouvé qui avait l'air utile. Des idées?


4 commentaires

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.


7 Réponses :


4
votes

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.


1 commentaires

Étant donné que cette bibliothèque lit les paramètres avec system.geproperty et j'ai besoin de savoir si je peux toujours les changer ou non.



15
votes

Vous pouvez utiliser le 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é.


AVERTISSEMENT STRUT>: Ce code ne fonctionne pas vraiment ici, dans le chargeur de système de système, FindOCLass () code> est protégé, vous devez le remplacer par votre propre chargeur de classe. P>

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>

if(ClassLoader.getSystemClassLoader().findLoadedClass("java.lang.String") != null){
    System.out.println("Yepee, String is loaded !");
}


5 commentaires

N'a pas cette cause chaîne à charger lorsque vous appellez la méthode appeler car il doit évaluer la chaîne string littéral "java.lang.string" ?


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 est toujours évaluée à vrai ?


Eh bien, si cela fonctionnerait, il serait toujours true (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 $



2
votes

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]


0 commentaires

2
votes

Vous pouvez essayer quelque chose comme ceci:

classe c = nouveau chargeur de classes () {Classe C = FindrodClass (Nom de classe); } .c;


0 commentaires

0
votes
Class.forName("com.abc.Xyz", true, this.getClass().getClassLoader())
It will block until the class has been initialized (by itself or some other thread)

0 commentaires

0
votes

Si ce n'est pas trop tard. Cela devrait fonctionner bien aussi

 Class.forName().newInstance();


1 commentaires

Remarque: Ceci sera seulement 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).



2
votes

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 sun.misc.unsafe Il existe une méthode qui précisément est-ce que: la méthode xxx

retour true si et seulement si la classe indiquée sous condition de paramètre est (chargé mais) non initialisée.


0 commentaires