2013-10-08 11 views
6

Tôi đang sử dụng gói reflections để có được một tập hợp các lớp triển khai một giao diện nhất định. Bộ này sẽ được sử dụng như một danh sách các tùy chọn dòng lệnh có thể. Vấn đề của tôi là tôi chỉ muốn có được lớp instantiable, nhưng ngay bây giờ có được cả hai lớp instantiable và không instantiable (ví dụ như các lớp trừu tượng) từ đoạn mã sau:Làm thế nào để tôi chỉ nhận được các lớp học có thể diễn đạt với các phản xạ

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); 
} 

Có cách nào để lọc các thiết lập được trả về bởi getSubTypesOf để lọc ra các lớp trừu tượng?

+0

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

+0

@rusmus, tôi đặc biệt yêu cầu không thể nhanh chóng các lớp và các lớp trừu tượng chỉ là một ví dụ về điều đó. Cấp, câu hỏi bạn liên kết bao gồm các lớp trừu tượng khá tốt, nhưng tôi không biết cách kiểm tra các giao diện. – halfdan

Trả lời

15

Sử dụng isInterface() phương pháp để phân biệt giữa các lớp và các giao diện.

Sử dụng Modifier.isAbstract(getClass().getModifiers()); để cho biết lớp học có là abstract hay không.

+0

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

3

Bạn có thể thử này

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

ngoài ra nó còn làm cho tinh thần để kiểm tra xem lớp có một constructor không có args

+1

Cảm ơn! Rất thích chấp nhận câu trả lời của bạn, nhưng chọn Adams đơn giản chỉ vì tôi thích phương pháp isAbstract. – halfdan

Các vấn đề liên quan