1

1 つのパッケージ内のすべてのインターフェイスのリストを取得したいので、新しいインターフェイスのリストを手動で更新する必要はありません。そのため、リフレクションを介して、特定のパッケージ内のすべてのインターフェイスのリストを取得できるかどうかを考えました。パッケージ内のすべてのクラスを取得できることはわかっていますが、インターフェイスを使用してそれを行う方法がわかりません。

4

3 に答える 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 に答える