簡體   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