La Java statique compilateur (javac) inlines statique final variables et apporte directement les valeurs de la constante de la piscine. Considérons l'exemple suivant. Classe définit des constantes (public static final variables):
public class A {
public static final int INT_VALUE = 1000;
public static final int STRING_VALUE = "foo";
}
Classe B utilise ces constantes:
public class B {
public static void main(String[] args) {
int i = A.INT_VALUE;
System.out.println(i);
String s = A.STRING_VALUE;
System.out.println(s);
}
}
Lors de la compilation de la classe B, javac obtient les valeurs de ces constantes de la classe A et inlines ces valeurs dans B.class. En conséquence, la dépendance de B avait de catégorie A au moment de la compilation est effacée à partir du bytecode. C'est un peu étrange comportement parce que vous êtes de cuisson dans les valeurs de ces constantes au moment de la compilation. Et on pourrait penser que c'est l'une des choses les plus faciles que le compilateur JIT pouvez le faire au moment de l'exécution.
Est-il possible ou cachés compilateur option qui permet de désactiver cette fonctionnalité inline comportement de javac? Pour le fond, nous sommes à la recherche à faire du bytecode de l'analyse de la dépendance de fins, et il est l'un des rares cas où le bytecode de l'analyse ne parvient pas à détecter au moment de la compilation des dépendances. Merci!
Edit: c'est une question épineuse, car normalement nous n'avons pas le contrôle de toutes les sources (par exemple, les bibliothèques de tiers que définir des constantes). Nous sommes intéressés à la détection de ces dépendances du point de vue de l'aide de l'une des constantes. Depuis que la référence est effacé du code qui utilise les constantes, il n'est pas facile à détecter, court de faire de l'analyse du code source.