2012-03-12 72 views
5

我需要做一些處理以使用反射來確定JSR-330註釋類的依賴關係。Java:如何使用反射檢查方法是否被覆蓋

我完全瞭解所有符合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; 
} 

對於overriddenBy番石榴般的謂語,我會檢查:

  • 定義類的方法是在isAssignableFrom關係
  • 方法名是相同的
  • 方法正式PARAM e是相同的

由此產生的複雜性是關於層次結構中方法數量的O(n^2)。

我想知道是否有一些更容易或更有效的方式來實現它,或任何具有這種功能的庫。我在Guava和Apache Commons中找不到成功......

+0

Google Reflections也許? http://code.google.com/p/reflections/ – biziclop 2012-03-12 18:45:41

+0

我查看了javadocs,沒有發現任何檢查方法覆蓋的內容。不錯的圖書館,但我會記住! – Eleaar 2012-03-12 19:20:18

+0

最糟糕的是它會讓您的算法更容易實現。:) – biziclop 2012-03-12 19:42:09

回答

1

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

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