我可以将模板化 class 中的 class 文字作为注释的参数传递吗?
Can I pass a class literal from a templated class as an argument for an annotation?
我有一个注释,它以 Class<?>
作为值(来自 springfox 的 @ApiResponse
的响应字段)。我想要映射的响应是模板化的 class (PageDTO<T>
) 但我无法为我的特定实体获取 class 文字,例如PageDTO<BusinessClass>.class
。
唯一可行的选项是定义另一个 class:
class Doc extends PageDTO<BusinessClass>
并将Doc.class的值作为参数传递。
有没有一种方法可以在不为每个注释方法定义 class 的情况下实现相同的结果?
我试过双投法:
(Class<PageDto<BusinessClass>>)(Class<?>)PageDTO.class
但是没有用。
Class 确实表示单个 class,PageDTO<BusinessClass>
不是 class 它是 PageDTO
class 的参数化泛型类型BusinessClass
class 参数。 (参见 java.lang.reflect.ParameterizedType
/java.lang.reflect.Type
)
所以答案是:这是不可能的。
这里最大的问题是你想使用注释,否则你可以使用与 GSON 库中的 TypeToken
类似的语法(或者只是使用它),但是对于注释你需要创建正常的命名 class为此。
你真的需要那种类型吗?你不能从其他地方读到它吗? (我对 springfox 不熟悉)也许 return 类型?
否则,您可以尝试为 class 和可选参数创建更高级的注释,但这也远非完美 - 因为您将无法处理嵌套的泛型类型或通配符。
其他选择是使用字符串来表示泛型类型,但它不是类型安全的,您需要或编写一些库来将其解析回 java.lang.reflect.Type
我有一个注释,它以 Class<?>
作为值(来自 springfox 的 @ApiResponse
的响应字段)。我想要映射的响应是模板化的 class (PageDTO<T>
) 但我无法为我的特定实体获取 class 文字,例如PageDTO<BusinessClass>.class
。
唯一可行的选项是定义另一个 class:
class Doc extends PageDTO<BusinessClass>
并将Doc.class的值作为参数传递。
有没有一种方法可以在不为每个注释方法定义 class 的情况下实现相同的结果?
我试过双投法:
(Class<PageDto<BusinessClass>>)(Class<?>)PageDTO.class
但是没有用。
Class 确实表示单个 class,PageDTO<BusinessClass>
不是 class 它是 PageDTO
class 的参数化泛型类型BusinessClass
class 参数。 (参见 java.lang.reflect.ParameterizedType
/java.lang.reflect.Type
)
所以答案是:这是不可能的。
这里最大的问题是你想使用注释,否则你可以使用与 GSON 库中的 TypeToken
类似的语法(或者只是使用它),但是对于注释你需要创建正常的命名 class为此。
你真的需要那种类型吗?你不能从其他地方读到它吗? (我对 springfox 不熟悉)也许 return 类型?
否则,您可以尝试为 class 和可选参数创建更高级的注释,但这也远非完美 - 因为您将无法处理嵌套的泛型类型或通配符。
其他选择是使用字符串来表示泛型类型,但它不是类型安全的,您需要或编写一些库来将其解析回 java.lang.reflect.Type