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

标签 java generics reflection

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

相关文章:

java - virtuoso-opensource : using jenaprovider, 如何从文件而不是从 URL 读取数据?

java - 如何使用 JDK8 可选为可空字段创建自定义 IntelliJ getter 模板

java - Java 中的接口(interface)派生

java - Method.invoke 不适用于包私有(private)类

java - 泛型作为方法返回类型

java - 在 Java 中比较 Ip 范围列表(与 CIDR)

java - 如何使用 java 从 SOAPUI 测试用例中删除自定义属性?

c# - 如何检查具有特定属性的对象的列表集合?

ios - 在 Swift 4 中解码泛型类的可编码树

java - 无法运行依赖项 main 函数