我的工作項目最近從Java 7切換到Java 8.我希望能夠找到有一個抽象方法作爲導入功能接口到我們的代碼庫的候選人接口。 (註釋現有接口爲@FunctionalInterface
,從java.util.function
的接口擴展它們,或者可能只是替換它們)。如何搜索具有單一方法的接口的Java代碼庫?
回答
的reflections項目能夠找到並返回在類路徑中的所有類。這裏有一個工作示例:
ReflectionUtils.forNames(new Reflections(new ConfigurationBuilder().setScanners(new SubTypesScanner(false))
.addUrls(ClasspathHelper.forClassLoader()))
.getAllTypes()).stream()
.filter(Class::isInterface)
.collect(toMap(c -> c,
c -> Arrays.stream(c.getMethods())
.filter(m -> !m.isDefault())
.filter(m -> !Modifier.isStatic(m.getModifiers()))
.filter(m -> !isObjectMethod(m))
.collect(toSet())))
.entrySet().stream()
.filter(e -> e.getValue().size() == 1)
.sorted(comparing(e -> e.getKey().toString()))
.map(e -> e.getKey().toString() + " has single method " + e.getValue())//getOnlyElement(e.getValue()))
.forEachOrdered(System.out::println);
的isObjectMethod
助手的定義是這樣的:
private static final Set<Method> OBJECT_METHODS = ImmutableSet.copyOf(Object.class.getMethods());
private static boolean isObjectMethod(Method m){
return OBJECT_METHODS.stream()
.anyMatch(om -> m.getName().equals(om.getName()) &&
m.getReturnType().equals(om.getReturnType()) &&
Arrays.equals(m.getParameterTypes(),
om.getParameterTypes()));
}
這不會幫助你返回到源代碼,並添加註釋,但它會給你一個可以工作的清單。
如果接口重寫'Object'的方法,比如'Comparator'呢?然後,該方法應該被濾除。而'靜態'方法也應該被刪除。或者更好,只要讓過濾器只傳遞'abstract'方法。是否有理由使用'stream(spliterator(c.getMethods(),0),false)'而不是'Arrays.stream(c.getMethods())'? – Holger
您的意見更新 –
爲什麼不'.filter(M - > Modifier.isAbstract(m.getModifiers()))',而不是'.filter(M - > m.isDefault()!)過濾器(M - >! Modifier.isStatic(m.getModifiers()))'? – Holger
- 1. 尋找具有包含無效單參數方法的接口的Java庫
- 2. 如何搜索Java代碼庫中的特定字符串?
- 3. 如何編寫搜索方法代碼一次搜索多個id
- 4. 如何搜索具有不同語言代碼的字符串
- 5. 如何通過Java API中的方法名稱搜索類/接口?
- 6. 任何IntelliJ IDEA插件來搜索java庫的源代碼?
- 7. 搜索具體的代碼字符串
- 8. 具有不同方法參數的Java接口
- 9. 搜索項目所有寶石源代碼的最佳方法
- 10. Javascript搜索表單代碼
- 11. 聲明的接口方法具有實現該接口
- 12. 如何調用具有接口作爲參數的方法?
- 13. 在代碼庫中搜索特定單詞的最佳工具或方法是什麼?
- 14. 用於搜索的Java代碼推文
- 15. Java - 接口方法
- 16. Java接口代碼錯誤?
- 17. 如何在java中搜索具有值的對象的arrray
- 18. Java:擴展一個類並實現具有相同方法的接口
- 19. 實現一個具有兩種不同方法簽名和接口的接口
- 20. 如何搜索'com.apple.coreaudio.avfaudio'的錯誤代碼?
- 21. Laravel:代碼搜索錯誤的地方
- 22. XML/Java簡單文本搜索; js或java的方法
- 23. 如何覆蓋一個Scala類中的type()java接口方法
- 24. Java的ArrayList的搜索方法
- 25. 如何在具有接口數組時調用具有變體接口的方法?
- 26. 搜索具有特定單詞的行
- 27. 如何描述一個具有bool Contains(T)方法作爲接口的T?
- 28. 重寫只有一個方法在Java接口的一個重載方法
- 29. 搜索方法只搜索第一行java
- 30. 有沒有更好的方法來找到搜索引擎代碼的交集?
這是可作爲的IntelliJ檢查。創建一個只有這種檢查的檢查配置文件,並在您的項目上運行它。 –
由於這種變化需要逐案分析,除了添加註釋之外,其他兩種解決方案都需要大量的重構,所以我不會去做。如果你沒有設計一個庫,添加註解也沒有提供太多的價值,因爲如果你在將接口轉換爲非函數接口的同時實現了lambda表達式,你會很快看到編譯問題。 –