I believe that you want Event.class.getDeclaredClasses()
.
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() + "'.");
}
}
}
Will give you the expected output:
event class name: 'Event$KeyboardEvent'.
event class name: 'Event$MouseEvent'.
event class name: 'Event$NetworkEvent'.
However, I think that you are looking for a more open scanning mechanism which does not limit itself to inner classes. Based on this question, it does not look like there is a straight-forward way to do this.
The Spring framework does something like this with its annotation scanning (see org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider
), but their approach is not a straight-forward method call.