Как собрать данные об использовании константных выражений с помощью анализа байт-кода?

Класс A объявляет константу C следующим образом:

public class A {
    public static final int C = 10;
}

Эта константа используется в методе M класса B следующим образом:

public class B  {
    public int M() {
        return A.C;
    }
}

В байт-кодах класса B метод M выглядит так:

public other()I
 L0
  LINENUMBER 29 L0
  BIPUSH 10
  IRETURN
 L1
  LOCALVARIABLE this Lcalc/B; L0 L1 0
  MAXSTACK = 1
  MAXLOCALS = 1

Итак, нигде в байт-коде нет ссылки на класс A, потому что компилятор Java оптимизирует константные выражения во время компиляции (см. этот связанный вопрос).

Как избежать этого явления, чтобы собрать использование класса A по классу B?


person cesarsotovalero    schedule 16.04.2020    source источник
comment
Отвечает ли это на ваш вопрос? можно ли отключить встраивание статических конечных переменных в javac?   -  person Andreas    schedule 17.04.2020
comment
Нет, это не так. Мне нужно провести анализ использования на уровне байт-кода. Я уже реализовал уловку изменения объявления C в классе A и поместил его в статическую конструкцию (вот как), как предлагает rveach здесь. Проблема в том, что он не меняет вызов в классе B, поскольку значение «оптимизируется» во время компиляции.   -  person cesarsotovalero    schedule 17.04.2020
comment
Невозможно воссоздать отсутствующую информацию. Поскольку только исходный код содержит информацию, нет никакого способа получить ее из исходного кода, например, перекомпилировать исходный код.   -  person Holger    schedule 17.04.2020