Статический компилятор 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? Для фона мы изучаем анализ байт-кода для целей зависимостей, и это один из немногих случаев, когда анализ байт-кода не позволяет обнаружить зависимости времени компиляции. Спасибо!
Изменить: это неприятная проблема, потому что обычно мы не контролируем весь источник (например, сторонние библиотеки, которые определяют константы). Мы заинтересованы в обнаружении этих зависимостей с точки зрения с использованием констант. Поскольку ссылка удаляется из кода, в котором использует константы, нет простого способа их обнаружить, не считая анализа исходного кода.