假设我有这个
Repository
:
public interface ProductRepository extends JpaRepository<Product, Integer> {}
并且我想在运行时知道这个存储库持续存在
Product
,而不是 Account
或其他任何东西。到目前为止我只想出了这个解决方案:
Class<?> persistedClass = ((ParameterizedType) repository.getClass() // some Spring proxy
.getInterfaces()[0] // ProductRepository or the like
.getGenericInterfaces()[0]) // JpaRepository
.getActualTypeArguments()[0] // the first type argument
让我们暂时忽略这种笨拙(这不是 Java Reflection API 课程的标准吗?)。更糟糕的是,我不得不删除
--release
选项,这使得解决方案的可移植性稍差(IntelliJ 中默认启用它)。有一些东西使得 java.base
(这是 ParameterizedType
所在的位置)和 --release
不兼容,从而阻止编译(我不太明白)
是否有更好的方法在运行时检索该信息?
您只需调用
AbstractRepositoryMetadata.getMetadata(…)
并调用 getDomainType()
等即可获得结果。
如果您对反向查找感兴趣,即查找域类型的存储库,您可以从
Repositories(…)
创建一个 ListableBeanFactory
实例,它将查找在该 BeanFactory
中注册的存储库实例的所有元数据.