[英]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.