我正在编写一个自定义 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/