Вы правы, CONSTANT_Class_info
не скажет вам, является ли ссылочный тип интерфейсом, и, кроме фактического разрешения типа, вы можете собирать только подсказки в текущем файле класса об ожидаемой природе типа и, возможно,обнаружить, когда он использовался непоследовательно.
Кроме CONSTANT_Methodref_info
ожидания, что объявленный тип не является интерфейсом, и CONSTANT_InterfaceMethodref_info
ожидания, что он является интерфейсом, наличие ссылки на тип в Поле super_class подразумевает неинтерфейсный тип, тогда как любой тип, присутствующий в массиве interfaces , подразумевает интерфейс.
В случае вложенных типов вы можете проверить атрибут InnerClasses., в котором перечислены все вложенные типы с их флагами доступа, включая ACC_INTERFACE
.
Кроме того, каждый тип, используемый в качестве аннотации, технически является интерфейсом, хотя атрибуты аннотации не используют элементы CONSTANT_Class_info
пулано лучше обращайтесь к именам типов и строкам подписи (CONSTANT_Utf8_info
) напрямую.