Статический компилятор Java (javac) встраивает некоторые статические конечные переменные и переносит значения непосредственно в пул констант. Рассмотрим следующий пример. Класс A определяет некоторые константы (публичные статические конечные переменные):
public class A {
public static final int INT_VALUE = 1000;
public static final String STRING_VALUE = "foo";
}
Класс B использует следующие константы:
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);
}
}
Когда вы компилируете класс B, javac получает значения этих констант из класса A и вставляет эти значения в B.class. В результате зависимость B, приходящаяся на класс A, во время компиляции стирается из байт-кода. Это довольно своеобразное поведение, потому что вы запекаете значения этих констант во время компиляции . И вы могли бы подумать, что это одна из самых простых вещей, которую JIT-компилятор может делать во время выполнения.
Есть ли какой-либо способ или какая-либо скрытая опция компилятора, которая позволяет отключить это встроенное поведение javac? Для справки, мы рассматриваем анализ байт-кода для целей зависимости, и это один из немногих случаев, когда анализ байт-кода не может обнаружить зависимости во время компиляции. Спасибо!
Редактировать : это досадная проблема, потому что обычно мы не контролируем весь источник (например, сторонние библиотеки, которые определяют константы). Мы заинтересованы в обнаружении этих зависимостей с точки зрения с использованием констант. Поскольку ссылка стирается из кода, который использует константы, нет простого способа их обнаружить, если не выполнять анализ исходного кода.