1 つのパッケージ内のすべてのインターフェイスのリストを取得したいので、新しいインターフェイスのリストを手動で更新する必要はありません。そのため、リフレクションを介して、特定のパッケージ内のすべてのインターフェイスのリストを取得できるかどうかを考えました。パッケージ内のすべてのクラスを取得できることはわかっていますが、インターフェイスを使用してそれを行う方法がわかりません。
2224 次
3 に答える
2
パッケージ内のすべてのクラスを列挙する方法を知っている場合は、最初に列挙してから、 を呼び出して結果をフィルタリングしますClass.isInterface()
。
関連項目を見る
于 2012-09-30T08:04:26.683 に答える
1
パッケージ内のすべてのクラスをリストすることができます。次に、各クラスをチェックして、それがメソッドとのClass#isInterface()
インターフェースであるかどうかを確認できます。
于 2012-09-30T08:04:40.410 に答える
1
「新しいインターフェースのリストを手動で更新する」とはどういう意味か正確にはわかりませんが、特定のパッケージに含まれるすべてのインターフェースのリストを単純に取得したい場合、Spring を使用すると、次のことができます。
// Instantiate new ClassPathScanner, usualy used to get classes annotated with @Service, @Component.
// The false paramater is provided to disable these default filters.
// Since the ClassPathScanningCandidateComponentProvider only scanns for toplevel classes we
// override the default isCandidateComponent Method to return Interfaces instead.
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false) {
@Override
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
return beanDefinition.getMetadata().isInterface();
}
};
// Filter to include only classes that have a particular annotation.
// Since we disables the default filters we have to provide this one.
// Here we can provide any regex we want, in this case we fillter all provided classes / interfaces.
provider.addIncludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*")));
// define package to scan.
Set<BeanDefinition> beans = provider.findCandidateComponents("compu.global.hyper.mega.net");
beans.forEach(bd -> {
System.out.println(bd.getBeanClassName());
});
于 2018-07-26T13:01:14.027 に答える