J'essaie de comprendre comment fonctionne le chargeur de classe. J'ai construit une application de test simple et exécutée dans -verbose: mode de classe. J'ai une interface et une classe.
interface p> classe p> Je cours la commande ci-dessous dans l'application principale et obtenez la sortie attendue . L'interface et la classe sont chargées dans la mémoire, car j'ai accédé à un champ statique de la classe d'éléphants p> lorsque j'exécute le code ci-dessous, je vois que seule la classe d'animaux est chargé que j'attends aussi. P> //When i run the below code i only get the value of the integer but not the class loading info
System.out.println("The integer is " + Animal.h);
The integer is 8
4 Réponses :
Je ne me souviens pas de cela exactement, mais je pense que c'est parce que h est "finale statique publique" dans une interface. Cela signifie que la constante est simplement redéfinie à l'intérieur de l'éléphant.Class Bytecode, si je ne me trompe pas, ce qui signifie que l'animal n'est pas nécessaire à ce stade. P>
Mais l'éléphant n'est pas non plus chargé dans le troisième cas
TRUE, la constante est inlinée dans votre classe principale, comme décrit par Zhekakozlov.
COMPILER JAVA INLINES Constantes finales statiques ( comme vous Voir, il n'y a aucune référence à Int H Code> Dans l'interface est implicitement statique et finale), votre code compile efficacement à ceci:
animal code> plus. C'est pourquoi il n'est pas chargé. P> p>
sont des interfaces chargées différemment? p> blockQuote>
En fait, non. (Vous obtiendrez la même chose si vous essayiez d'accéder à un
Final Static (Code> Dural Code> d'une classe dans une autre classe.) P>
Comment puis-je accéder à la valeur entière si elle n'est pas chargée? P> blockQuote>
Vous vous référez à un champ initialisé avec une expression constante. L'expression est évaluée au moment de la compilation et la valeur est insérée dans les bytecodes au point qu'il est utilisé. Par conséquent, l'utilisation de ce champ d'interface em> ne déclenche pas la charge de classe. P>
Les sections pertinentes des JLS sont les suivantes: p>
Vous pouvez voir ce qui se passe lorsque vous regardez directement au bytecode. Avec la classe d'exemple: et son bytecode (indiquant uniquement test () code> pour brièveté): p>
public class Test {
public Test() {
}
public void test() {
System.out.println(8);
}
}