Хорошо известно, что компилятор Java извлекает значения постоянных полей из других классов во время компиляции. Полученный файл класса не содержит запись константного пула (любого типа) для таких констант.Сделать компилятор Java включать символическую константу поля ссылки в файле класса - возможно?
В: Может ли компилятор сказать, чтобы сделать именно это? (Oracle JDK 7 будет хорошо)
В качестве иллюстрации рассмотрим фрагмент кода out.println(some.other.class.FOO)
, который читает Foo (скажем, public static final int FOO = 1234
) и выводит его. Я могу найти ссылки на println
без проблем, но константа превращается в анонимную sipush 1234
.
Для анализа зависимости на уровне класса было бы здорово иметь прозрачность здесь! Заметьте, что я не прошу внести какие-либо измененные значения там как-то появятся в зависимом коде (см. Множество других вопросов по этому вопросу) ...
Я подумываю о подключении API Java Compiler javac, но это звучит немного надуманно? Есть идеи?
http://www.stackoverflow.com/questions/3524150/is-it-possible-to-disable-javacs-inlining-of-static-final-variables?rq=1 –
Можете ли вы уточнить, что вам нужен компилятор? .. Я думаю, у меня может быть интересный ответ ... –
Спасибо @ RC за другой указатель. Извините, что я пропустил это при поиске (и, вероятно, еще ...). @ Jean-François, идея состоит в том, чтобы каким-то образом создать синтетический (неиспользуемый) Fieldref (как для GETSTATIC opcodes) в Constant Pool. Я понимаю, что это будет только для * собственного * кода (требуется компиляция), но сохранит инструмент проверки дефрагментации, по крайней мере, на уровне класса, а не на уровне исходного кода. – mgaert