私が取り組んでいるプロジェクトは、最近Java 7からJava 8に切り替えました。機能ベースのインタフェースをコードベースに導入する候補として、抽象メソッドを1つしか持たないインタフェースを探したいと思います。 (既存のインターフェイスに@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'のようにどうなりますか?次に、メソッドをフィルタリングする必要があります。また、 'static'メソッドも取り除かなければなりません。あるいは、フィルターが '抽象'メソッドだけを渡すようにしてください。 'Arrays.stream(c.getMethods()) 'の代わりに' stream(spliterator(c.getMethods()、0)、false) 'を使う理由がありますか? – Holger
あなたのコメントで更新されました –
'.filter(m - >!m.isDefault())の代わりに' .filter(m - > Modifier.isAbstract(m.getModifiers() Modifier.isStatic(m.getModifiers())) '? – Holger
- 1. WPFで単一のスナップポイントを持つSliderコントロールを作成するにはどうすればよいですか?
- 2. Javaで一意のキーを持つHashMapを使用するにはどうすればよいですか?
- 3. リスト内の属性を持つ要素を検索するにはどうすればよいですか?
- 4. アイテム値を持つリストボックスアイテムインデックスを検索するにはどうすればよいですか?
- 5. 検索の一部と一致するレコードを取得するにはどうすればよいですか?
- 6. インタフェースと一緒に「次世代」Javaデータオブジェクトスタイルを使用するにはどうすればよいですか?
- 7. PHPでhtmlタグの間にある単語を検索するにはどうすればよいですか?
- 8. mysqlでレコードを検索するにはどうすればよいですか?
- 9. アンドロイドアプリケーションでスタックアクティビティを検索するにはどうすればよいですか?
- 10. LuceneでDBを検索するにはどうすればよいですか?
- 11. jsonでjsonを検索するにはどうすればよいですか?
- 12. PerlでCSSを検索するにはどうすればよいですか?
- 13. Stack.PHPでスタックオーバーフローを検索するにはどうすればよいですか?
- 14. eclipseでライブラリを検索するにはどうすればよいですか?
- 15. 一部のテキストですべてのGuidを検索するにはどうすればよいですか?
- 16. ウェブサイトのトピックを検索するにはどうすればよいですか?
- 17. hibernate検索でint値の検索を実装するにはどうすればよいですか?
- 18. haystack検索で検索結果の数を取得するにはどうすればよいですか?
- 19. javaで単一のHTTPリクエストでオブジェクトとファイルを送信するにはどうすればよいですか?
- 20. 良いSQL検索を行うにはどうすればよいですか?
- 21. Mechanize :: Pageの検索メソッドからMechanizeオブジェクトを取得するにはどうすればよいですか?
- 22. 複数の検索を行うにはどうすればよいですか?
- 23. MongoDBで文字列の一部を検索するにはどうすればよいですか?
- 24. sqlite3で文字列の一部を検索するにはどうすればよいですか?
- 25. 検索エンジン指標についてどうすればよいですか?
- 26. Googleスプレッドシートを検索するにはどうすればよいですか?
- 27. ストアドプロシージャコールを検索するにはどうすればよいですか?
- 28. 検索スクリプトを改善するにはどうすればよいですか?
- 29. 検索クエリを変更するにはどうすればよいですか?
- 30. シェアポイント検索を監査するにはどうすればよいですか?
これはIntelliJでの検査として利用できます。この検査のみを持つ検査プロファイルを作成し、プロジェクトで実行します。 –
この変更には、ケースバイケースの分析が必要であり、アノテーションを追加するだけでなく、他の2つのソリューションはいずれも大幅なリファクタリングを必要とします。ライブラリを設計していない場合、ランダの実装をしている間にインターフェイスを非機能的なものに変換すると、コンパイルの問題がすぐに表示されるため、注釈を追加するだけでは大きな価値はありません。 –