亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取所有擴展類以推斷某些泛型的類

獲取所有擴展類以推斷某些泛型的類

幕布斯6054654 2021-03-30 13:14:49
我正在尋找一種方法來獲取擴展某個類并推斷某些泛型的所有類。我知道使用Reflectionsi可以獲取擴展一個類的所有類final Reflections reflections = new Reflections("path.to.package");Set<Class<? extends ClassBase>> classes = reflections.getSubTypesOf(ClassBase.class);但是我不確定如何只使用某些泛型。這是我想要實現的示例假設我有 ClassBase<T>public class ClassBase<T> {}然后我有了ClassA ClassB ClassC,他們都在延伸ClassBasepublic class ClassA extends ClassBase<Long> {}public class ClassB extends ClassBase<Long> {}public class ClassC extends ClassBase<Integer> {}我怎么只得到ClassA和ClassB?我什至可以接受所有擴展的類,ClassBase然后過濾掉我不需要的那些類,只要我最終得到的集合中只包含那些擴展ClassBase并推斷<Long>為泛型類型的類即可?;蛘吒玫氖?,我實際上想要的Set<Class<ClassBase<Long>>>不僅僅是一個Set<Class<ClassBase>>只包含那些推斷Long為通用的
查看完整描述

2 回答

?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

您可以通過使用函數來查看推斷的泛型類型getGenericSuperclass,然后再看getActualTypeArguments一個示例:


// Given that all classes in this set are actually subclasses of ClassBase

Set<Class<? extends ClassBase>> classes = Set.of(ClassA.class, ClassB.class, ClassC.class);

System.out.println(classes); // [class test.ClassB, class test.ClassA, class test.ClassC]


@SuppressWarnings("unchecked")

Set<Class<? extends ClassBase<Long>>> result = classes.stream()

    .filter(cls -> {

        // Get superclass, which is ClassBase, so assume it's also parameterized

        ParameterizedType superClass = (ParameterizedType) cls.getGenericSuperclass();

        Type inferred = superClass.getActualTypeArguments()[0]; // get first type argument

        return inferred == Long.class; // check if it's 'Long'

    })

    // Can now say they all extend ClassBase<Long>

    .map(cls -> (Class<? extends ClassBase<Long>>) cls)

    .collect(Collectors.toSet());


System.out.println(result); // [class test.ClassA, class test.ClassB]

您將獲得一個Set<Class<? extends ClassBase<Long>>>包含擴展類的ClassBase<Long>。Set<Class<ClassBase<Long>>>您所要求的A ,從技術上講應該只擁有該類ClassBase本身,而您實際上對子類卻很感興趣,因此您可以得到Class<? extends ClassBase<Long>>。


查看完整回答
反對 回復 2021-04-21
?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

對于使用的彈簧人,并將這些類由容器管理(它們標注有一些春天注解喜歡@Service@Component),你可以得到所有用以下方法的類:

@Inject Set <ClassBase <Long>> extensionsWithLongType;


查看完整回答
反對 回復 2021-04-21
  • 2 回答
  • 0 關注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號