Могу ли я передать литерал класса из шаблонного класса в качестве аргумента для аннотации? - PullRequest
0 голосов
/ 13 июня 2018

У меня есть аннотация, которая принимает Class<?> в качестве значения (поле ответа @ApiResponse от springfox).Ответ, который я хочу отобразить, является шаблонным классом (PageDTO<T>), но я не могу получить литерал класса для моей конкретной сущности, например PageDTO<BusinessClass>.class.Единственная работающая опция - это определение другого класса:

class Doc extends PageDTO<BusinessClass> 

и передача значения Doc.class в качестве параметра.

Есть ли способ достижения того же результата без определения классадля каждого аннотированного метода?

Я пробовал метод двойного приведения:

(Class<PageDto<BusinessClass>>)(Class<?>)PageDTO.class 

, но он не работал.

1 Ответ

0 голосов
/ 25 июня 2018

Класс представляет отдельный класс, PageDTO<BusinessClass> - это не класс, это параметризованный универсальный тип класса PageDTO с параметром класса BusinessClass.(см. java.lang.reflect.ParameterizedType / java.lang.reflect.Type)

Поэтому ответ таков: это невозможно.

Самая большая проблема здесь заключается в том, что вы хотите использовать аннотации, так как в противном случае вы можете использовать синтаксис, аналогичный TypeToken из библиотеки GSON (или просто использовать его), но с аннотациями вам потребуется создать нормальный именованный класс дляэтот.

Тебе действительно нужен этот тип?ты не можешь прочитать это из другого места?(Я не знаком с springfox), может быть, возвращаемый тип?
В противном случае вы можете попытаться создать более сложную аннотацию с местом как для класса, так и для необязательных параметров, но это также будет далеко от совершенства - так как вы не сможетеобрабатывать вложенные универсальные типы или подстановочные знаки.
Другой вариант - использовать строки для представления универсального типа, но тогда это небезопасно, и вам понадобится или напишет некоторую библиотеку, чтобы проанализировать это обратно в java.lang.reflect.Type

...