2017-09-13 6 views
-2

Disons que je défini un int constant dans le fichier A.java:java 8 constant_pool dépendance constante

public final static int CONSTAN_VALUE_IN_A = 0; 

lorsque j'utilise cette valeur dans un autre fichier B.java:

int fooBValue = A.CONSTAN_VALUE_IN_A; 

après avoir compilé mon projet, en B.class, j'ai:

fooBValue = 0 

Je veux savoir si je peux obtenir où la valeur « 0 » viennent de (A.java) lorsque je n'ai que le fichier B.class sans le code source. J'ai entendu que lors de la compilation avec java8, je peux savoir que B.java utilise une valeur constante dans A.java en lisant le pool constant dans B.class. Mais je ne suis pas vraiment sûr à ce sujet ou comment obtenir la classe réelle de la constante en lisant le pool constant.

+1

'Je veux savoir si je peux savoir d'où vient la valeur" 0 ", que voulez-vous dire exactement? – procrastinator

+1

La valeur est une valeur, elle ne peut pas "provenir". On a l'impression de parler des mêmes valeurs pour les variables de type référence, mais pas dans ce contexte. – Andremoniy

+0

@procrastinateur "provient de" signifie où cette valeur constante est définie. –

Répondre

-1

Presque certainement pas.

De nombreuses valeurs static final sont même remplacées au moment de la compilation par la valeur réelle associée à la constante.

static final int X = 0; 
static final int Q = 9; 

private void test(String[] args) { 
    int x = X; 
    int y = Q; 
} 

serait probablement transformé dans les premières étapes de la compilation dans:

private void test(String[] args) { 
    int x = 0; 
    int y = 9; 
} 

donc les chances de découvrir où la valeur provenait en fait de sont très petit.

+0

Même si je ne suis pas un descendant de votre réponse, pour moi la question elle-même n'a aucun sens; – Andremoniy

+0

Votre réponse se résume à _Almost certainement pas._ Le reste ils ont déjà mentionné dans leur question: _after j'ai compilé mon projet, dans B.class, j'ai [...] _. –

+0

@Andremoniy - Mon interprétation de * Je veux savoir si je peux obtenir d'où vient la valeur "0" (A.java) * est-ce que OP peut dire que la valeur résultante de 'fooBValue' (ie le' 0') est venue de la classe 'A'. – OldCurmudgeon

3

JLS 4.12.4 définit une "variable constante" comme suit:

Une variable constante est une variable final de type primitif ou type String qui est initialisé avec une expression constante (§15.28).

JLS 13.1 décrit comment ces se retrouvent dans un fichier de classe:

3. Une référence à un champ qui est une variable constante (§4.12.4) doit être résolue au moment de la compilation à la valeur V désigné par l'initialiseur de la variable constante.

Si un tel champ est statique, aucune référence au champ ne doit être présente dans le code dans un fichier binaire, y compris la classe ou l'interface qui a déclaré le champ. Un tel champ doit toujours sembler avoir été initialisé (§12.4.2); la valeur initiale par défaut pour le champ (si différent de V) ne doit jamais être observée.

La déclaration en classe A

public final static int CONSTAN_VALUE_IN_A = 0; 

répond à la définition d'une variable constante, alors quand il est utilisé en classe B,

int fooBValue = A.CONSTAN_VALUE_IN_A; 

la valeur est réglée au moment de la compilation. Aucune référence à A.CONSTAN_VALUE_IN_A n'apparaît dans la classe B et la valeur résolue de 0 est compilée dans la classe B.Donc, non, il n'y a aucun moyen de dire d'où vient cette valeur dans B sauf si vous pouvez trouver le code source. Si vous n'aimez pas ce comportement, vous pouvez l'éviter en changeant les choses afin que les conditions de JLS 4.12.4 ne soient pas remplies, comme en le rendant non définitif, ou en changeant le type pour qu'il soit ni une primitive ni un String. Cependant, la meilleure façon d'en faire pas une variable constante est de déplacer l'initialisation dans un initialiseur statique:

public final static int CONSTAN_VALUE_IN_A; 
    static { 
     CONSTAN_VALUE_IN_A = 0; 
    } 

D'ailleurs, ce n'est pas nouvelle en Java 8; Ce comportement a été ainsi pendant très longtemps.

+1

Depuis la toute première version d'iirc. En Java1.1, c'est comme ça, c'est sûr. – Holger

+0

donc, avec le fichier B.class, je ne peux pas comprendre qu'il référence une valeur constante définie dans A.class, non? –

+0

@Raymond Guo: exactement. – Holger