繁体   English   中英

Java 从接口中提取带有反射的泛型类型参数

[英]Java extract generic type parameters with reflection from interface

我正在编写自定义 Java 注释,用于在 Java Spring 中使用反射处理 CrudRepositories。使用 org.reflections.reflections 库。 我将所有接口都用我的注释作为 class 文件进行注释,如下所示:

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

只有在某些时候扩展 JpaRepository 的接口在 class 级别用我的@MyAnnotation注释。


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

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

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

我现在的目标是提取底层 JpaRepository 的泛型类型参数。 如果带注释的 class 是 Java class,而不是接口,我就做到了。 我怎样才能为接口实现相同的目标? 我想我也因为 inheritance 而遇到麻烦。我想我必须获得“超类”,直到我到达 JpaRepository,然后稍微提取通用类型 arguments。

非常感谢帮助,提前致谢

我按照建议查看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());
    }
}

这之所以有效,是因为我事先确保我在此方法中输入的内容是有效的。 我是这样做的,我也注意到只有一个接口被扩展,通过扩展一个以上的接口必须弄清楚这些接口中的哪一个是 JpaRepository:

if (.repository;isInterface()) {throw new IllegalArgumentException();}

if (.JpaRepository.class;isAssignableFrom(repository)) {throw new IllegalArgumentException();}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM