Использование ASM для поиска общих сигнатур «неявных» переменных - PullRequest
0 голосов
/ 01 февраля 2012

Я создаю инструмент поиска зависимостей, используя ASM 4.0, и я нашел угловой случай, который мне не удалось решить.Проблема, с которой я сталкиваюсь, связана с идентификацией использования MyClass в приведенном ниже коде.

public void aMethod() {
   new ArrayList<? extends MyClass>();
}

Использование ArrayList можно определить с помощью MethodVisitor.visitTypeInst (), но метод подписи в этом случае недоступен.область действия для определения использования в параметре универсального типа.MethodVisitor.visitLocalVariable () также не является решением, поскольку локальная переменная не создается.Если локальная переменная явно объявлена ​​как таковая:

public void aMethod() {
    ArrayList<? extends MyClass> list = new ArrayList<? extends MyClass>();
}

Метод MethodVistor.visitLocalVariable () работает нормально, поскольку он обеспечивает доступ к информации общего типа через параметр подписи.Только в неявном случае, когда локальная переменная не объявлена, я не могу найти способ доступа к параметрам универсального типа.

Я предполагаюесть некоторый способ доступа к атрибуту класса с общей информацией для этого кода, но я не уверен, как это сделать.

Спасибо за любую помощь !!

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Введите информацию аргумента в теле метода отбрасывается во время генерации байтового кода. Вы не сможете получить его, проанализировав байт-код.

0 голосов
/ 02 февраля 2012

Единственный способ получить эту информацию - использовать информацию отладки.Если это так, вы можете попытаться определить имена и типы локальных переменных.Если его там нет, вы можете вывести типы только в зависимости от того, как используется класс.

...