2012-02-22 12 views
3

私が持っている:擬似コードでクラスのコレクションを構築する内部クラス

abstract class Event 
{ 
... 
public static class MouseEvent extends Event 
{ 
    ... 
} 
public static class KeyboardEvent extends Event 
{ 
    ... 
} 
public static class NetworkEvent extends Event 
{ 
    ... 
} 
} 

すべての内部クラスのサブクラスの名前/詳細のコレクションを取得するためのきちんとした方法はありますか?好ましくはベースの方法としてEventクラス...

答えて

2

私はあなたがほしいと思うと思うEvent.class.getDeclaredClasses()

event class name: 'Event$KeyboardEvent'. 
event class name: 'Event$MouseEvent'. 
event class name: 'Event$NetworkEvent'. 

は、しかし、私はあなたが内部クラスに自分自身を制限するものではありませんよりオープン走査機構を探していると思います:

import java.util.ArrayList; 
import java.util.List; 

public class Event { 
    public static class MouseEvent extends Event {} 
    public static class KeyboardEvent extends Event {} 
    public static class NetworkEvent extends Event {} 
    public static class NotAnEvent {} 

public static List<Class<?>> getDeclaredEvents() { 
     final Class<?>[] candidates = Event.class.getDeclaredClasses(); 
     final List<Class<?>> declaredEvents = new ArrayList<Class<?>>(); 
     for (final Class<?> candidate : candidates) { 
      if (Event.class.isAssignableFrom(candidate)) { 
       declaredEvents.add(candidate); 
      } 
     } 
     return declaredEvents; 
    } 

    public static void main(final String args[]) { 
     final List<Class<?>> events = Event.getDeclaredEvents(); 
     for (final Class<?> event : events) { 
      System.out.println("event class name: '" + event.getName() + "'."); 
     } 
    } 
} 

はあなたに期待される出力が得られます。 this質問に基づいて、これを行うには簡単な方法がないように見えます。

Springフレームワークは、アノテーションスキャン(org.springframework.context.annotation.ClassPathScanningCandidateComponentProviderを参照)でこのような処理を行いますが、そのアプローチは単純なメソッド呼び出しではありません。

+0

です? –

+0

それは 'Event.class.getDeclaredClasses()'ではありませんか? –

0
public static void main(String[] args) { 
     for (Class c : OuterClass.class.getClasses()) 
     { 
      System.out.println(c.getName()); 
     } 
    } 

、その後、あなたが

public class OuterClass { 

    public class InnerClass { 

    } 

    public class InnerClassA { 

    } 

    public class InnerClassC { 

    } 
} 

結果の印刷された文のクラスを持つことができますが、私は `Event`を拡張制限_のみ_クラスを追加したい場合は考えられるもの

OuterClass$InnerClass 
OuterClass$InnerClassA 
OuterClass$InnerClassC 
関連する問題