如何只获得具有反射的可实例化类

hal*_*dan 7 java reflection reflections

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法过滤返回的集合getSubTypesOf来过滤掉抽象类?

Ada*_*old 20

使用该isInterface()方法来区分类和接口.

使用Modifier.isAbstract( getClass().getModifiers() );告诉类是abstract或不是.


Evg*_*eev 5

你可以试试这个

cls.getModifiers() & Modifier.ABSTRACT == 0 && !cls.isInterface()
Run Code Online (Sandbox Code Playgroud)

此外,检查类是否具有无参数构造函数也很有意义