2013-10-08 4 views
6

reflectionsパッケージを使用して、特定のインタフェースを実装するクラスのセットを取得しています。このセットは、可能なコマンドラインオプションのリストとして使用されます。によって返されたセットをフィルタリングする方法はありリフレクトでインスタンス化可能なクラスのみを取得するには

Map<String, Class<? extends InterfaceOptimizer>> optimizerList = new HashMap<String, Class<? extends InterfaceOptimizer>>(); 

Reflections reflections = new Reflections("eva2.optimization.strategies"); 
Set<Class<? extends InterfaceOptimizer>> optimizers = reflections.getSubTypesOf(InterfaceOptimizer.class); 
for(Class<? extends InterfaceOptimizer> optimizer : optimizers) { 
    optimizerList.put(optimizer.getName(), optimizer); 
} 

:私の問題は、私が唯一のインスタンス化可能なクラスを取得したいが、今は次のコードの両方からインスタンス化および非インスタンス化クラス(例えば、抽象クラス)を取得することですgetSubTypesOf抽象クラスを除外しますか?それはクラスが引数なしのコンストラクタ

+0

http://stackoverflow.com/questions/1072890/how-can-i-determine-whether-a-java-class-is-abstract-by-reflection – rusmus

+0

@rusmusを参照してください。具体的には、クラスと抽象クラスはその一例にすぎません。確かに、リンクした質問は抽象クラスをかなりうまくカバーしていますが、インターフェースをチェックする方法はわかりませんでした。 – halfdan

答えて

15

使用して、クラスおよびインタフェースを区別するisInterface()方法を持っているかどうかを確認することは理にかなってほか

+0

if(Modifier.isAbstract(myclass.getModifiers())|| myclass.isInterface()) – fl0w

3

あなたはこの

cls.getModifiers() & Modifier.ABSTRACT == 0 && !cls.isInterface() 

を試すことができます。

Modifier.isAbstract(getClass().getModifiers());を使用して、クラスがabstractかどうかを確認します。

+1

ありがとう!あなたの答えを受け入れるのが好きですが、単に私がisAbstractメソッドを好むのでAdamsを選んだだけです。 – halfdan

関連する問題