簡體   English   中英

Java:如何使用反射檢查方法是否被覆蓋

[英]Java: How to check if a method is overridden, using reflection

我需要做一些處理來確定JSR-330帶注釋類的依賴關系,使用反射。

我完全了解所有符合JSR-330標准的IoC容器,如Spring,Guice或PicoContainer。 但是,我需要的不是解決和注入依賴關系,而是要識別它們。

這基本上意味着我需要實現JSR-330實現,至少在涉及反射類“解析”時。

JSR-330規范的一部分我覺得實現起來有點麻煩:

使用@Inject注釋的方法將覆蓋另一個使用@Inject注釋的方法,每個實例的每個注入請求只會注入一次。 不會注入沒有@Inject批注的方法,該方法將覆蓋使用@Inject注釋的方法。

這意味着子類可以重新定義其基類的自動裝配合同,以及掛鈎注入流(通過多態)。

我的問題出現了: 給定一個類層次結構,是否有一種簡單的方法可以檢查層次結構某些部分的方法是否在層次結構的下方被覆蓋?

在我的例子中,我最簡單的方法是從層次結構的葉子中遞歸:

private List<Method> getInjectableMethods(final Class<?> clazz) {
    // recursive stop condition
    if(clazz == null) {
        return emptyList();
    }

    // recursively get injectable methods from superclass
    final List<Method> allInjectableMethods = newLinkedList(getInjectableMethods(clazz.getSuperclass()));
    final List<Method> injectableMethods = newArrayList();

    // any overridden method will be present in the final list only if it is injectable in clazz
    for (final Method method : clazz.getDeclaredMethods()) {
        removeIf(allInjectableMethods, Methods.Predicates.overriddenBy(method));
        if (isInjectable(method)) {
            injectableMethods.add(method);
        }
    }
    allInjectableMethods.addAll(injectableMethods);

    return allInjectableMethods;
}

至於被覆蓋的類似番石榴的謂詞,我會檢查:

  • 定義類的方法是isAssignableFrom關系
  • 方法名稱是相同的
  • 方法形式參數是相同的

對於層次結構中的方法數量,產生的復雜度為O(n ^ 2)。

我想知道是否有更簡單或更有效的方法來實現它,或任何具有此類功能的庫。 我在Guava和Apache Commons中看起來都沒有成功......

不幸的是,類圖只能在根方向導航 - 所以除了檢查某些類加載器可用的所有類之外,無法找到所有派生類。 IoC容器沒有這個問題,因為它們總是知道具體的實現(它是配置的一部分)

繼承樹通常由IDE構建,但是AFAIUK它們對所有可用的源/類使用brite force索引(您可以查看InteliiJ IDEA的社區editio的來源以獲取線索)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM