Получить все зависимости класса класса (включая дженерики)?

Я хочу извлечь все Class зависимости из заданного Class (чтобы создать тест Arquillian с моим Класс и все его зависимости).

Мне просто удается это сделать (используя CtClass.getRefClasses() из Javassist), но я застрял с дженериками (похоже, Javassist правильно анализирует дженерики, но не имеет никакого API для их получения).

Вот ядро ​​моего рекурсивного метода inspect на данный момент:

for (String className : (Iterable<String>)ClassPool.getDefault().get(klass.getName()).getRefClasses()) {
    try {
        inspect(Class.forName(className), classSet); // recursion
    } catch ( // ClassNotFoundException and NoClassDefFoundError handling
    }
}

Эта итерация работает правильно для получения всех зависимостей Classes, но если Class, который я хочу проверить, манипулирует, например, List<MyClass>, у меня не будет MyClass из Collection, возвращенного getRefClasses().

Я проверил файл .class, и в байт-коде есть эта информация (Ljava/util/List<Lmy/company/MyClass;>;).

Знаете ли вы другой API, который я мог бы использовать для извлечения всех используемых Classes из заданного Class ?


person Anthony O.    schedule 07.06.2012    source источник
comment
У вас есть какие-то успехи в этом, которыми вы хотели бы поделиться? Хотел написать точно такой же вопрос и нашел ваш :о)   -  person hhravn    schedule 15.07.2012


Ответы (1)


Вы можете использовать ASM и реализовать посетителя, который записывает все классы всякий раз, когда он посещает инструкцию типа или объявление переменной, и т. д. Вы также получаете доступ к дескрипторам подписи (это Ljava/util/List<Lmy/company/MyClass;>;).

Однако не все зависимости будут присутствовать в файле класса. Допустим, вы создаете new ArrayList<MyClass> и не назначаете его переменной, тогда информация об аргументе типа будет потеряна.

person Ben Schulz    schedule 07.06.2012
comment
Спасибо за ваш ответ ! Я знаю о new + дженериках, и я думаю, что это не проблема для того, что я хочу сделать. Тем не менее, есть ли у вас четкая ссылка, учебник или пример кода для вашего решения?... Я просмотрел ASM, и на первый взгляд это кажется немного сложным для понимания... - person Anthony O.; 07.06.2012
comment
@ЭнтониО. Просто ознакомьтесь с руководством по ASM 2.0. Автор учебника, Евгений Кулешов, также опубликовал ссылку. ;) - person Ben Schulz; 07.06.2012