0
votes

Lorsque Classloader charge des interfaces en Java?

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> xxx pré>

classe p> xxx pré>

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> xxx pré>

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


0 commentaires

4 Réponses :


0
votes

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.


2 commentaires

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.



2
votes

COMPILER JAVA INLINES Constantes finales statiques ( Int H Dans l'interface est implicitement statique et finale), votre code compile efficacement à ceci: xxx

comme vous Voir, il n'y a aucune référence à animal plus. C'est pourquoi il n'est pas chargé.


0 commentaires

1
votes

sont des interfaces chargées différemment?

En fait, non. (Vous obtiendrez la même chose si vous essayiez d'accéder à un Final Static (Code> Dural d'une classe dans une autre classe.)

Comment puis-je accéder à la valeur entière si elle n'est pas chargée?

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 ne déclenche pas la charge de classe.

Les sections pertinentes des JLS sont les suivantes:


0 commentaires

0
votes

Vous pouvez voir ce qui se passe lorsque vous regardez directement au bytecode. Avec la classe d'exemple: xxx pré>

et son bytecode (indiquant uniquement test () code> pour brièveté): p>

public class Test {
    public Test() {
    }

    public void test() {
        System.out.println(8);
    }
}


0 commentaires