gpt4 book ai didi

Java通过接口(interface)反射提取泛型类型参数

转载 作者:行者123 更新时间:2023-12-01 17:13:07 25 4
gpt4 key购买 nike

我正在编写一个自定义 Java 注释,用于在 Java Spring 中使用 Reflection 处理 CrudRepositories。使用 org.reflections.reflections 库。我将用我的注释注释的所有接口(interface)作为类文件,如下所示:

Reflections reflections = new Reflections("basePackage");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(MyAnnotation.class);

只有在某些时候扩展 JpaRepository 的接口(interface)才用我的 @MyAnnotation 进行注释。在类(class)层面。


我的存储库结构如下:有两种情况,

第一种情况:
public interface SomeRepo extends JpaRepository<SomeEntity, Long> {...}

第二种情况由继承层次结构组成:
public interface SuperClassRepo <T extends SomeRandomEntity> extends JpaRepository<T, String> {...}
public interface SubClassRepo extends SuperClassRepo<SubEntityOfSomeRandomEntity> {...}

我现在的目标是提取底层 JpaRepository 的通用类型参数。如果带注释的类是 Java 类,而不是接口(interface),我就实现了这一点。我怎样才能在界面上实现同样的效果?我想我也因为继承而遇到麻烦。我想我必须获得“父类(super class)”,直到到达 JpaRepository,然后稍微提取泛型类型参数。

非常感谢您的帮助,提前致谢

最佳答案

我通过查看 GenericsUtils#getParameterType 找到了解决方案按照建议:

private static Class<?> extractKeyFromRepository(Class<?> repository) {
ResolvableType currentType = ResolvableType.forType(repository);
ResolvableType resolvableType = currentType.getInterfaces()[0];

if (JpaRepository.class.equals(resolvableType.getRawClass())) {
ResolvableType[] generics = resolvableType.getGenerics();
ResolvableType generic = generics[1];

return generic.resolve();
} else {
return extractKeyFromRepository(resolvableType.toClass());
}
}

这之所以有效,是因为我事先确保我放入此方法中的内容是有效的。我这样做,而且我注意到只扩展了一个接口(interface),通过扩展多个接口(interface),必须弄清楚这些接口(interface)中的哪一个是 JpaRepository:

if (!repository.isInterface()) {抛出新的 IllegalArgumentException();}

if (!JpaRepository.class.isAssignableFrom(repository)) {抛出新的 IllegalArgumentException();}

关于Java通过接口(interface)反射提取泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61411028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com