Burningwave Classhunter是否支持“非”运算符?如何筛选无无参构造方法类
用Burningwave Classhunter筛选无无参构造方法的类
当然可以实现,核心是要筛选出完全不存在任何无参构造方法的类(包括编译器自动生成的默认无参构造)。你之前尝试的直接对构造方法断言取反会包含同时存在带参和无参构造的类,这不是我们要的结果,这里提供两种可靠的实现方式:
方式一:利用ConstructorCriteria的noneThoseThatMatch(推荐)
Burningwave的成员Criteria提供了noneThoseThatMatch方法,用于判断没有任何成员匹配指定条件,正好符合我们的需求——筛选出没有无参构造方法的类:
SearchConfig.forPaths(classPath) .by(ClassCriteria.create() .allThoseThatMatch((cls) -> cls.isAnnotationPresent(ManagedBean.class)) .and() .byMembers( ConstructorCriteria.withoutConsideringParentClasses() .noneThoseThatMatch((constructor) -> constructor.getParameterCount() == 0) ) );
这个写法完全遵循Burningwave的API设计,noneThoseThatMatch会检查目标类的所有构造方法(不考虑父类),确认没有一个是无参的,才会将该类纳入结果。
方式二:在类匹配器中手动校验构造方法
如果更倾向于在类的断言逻辑里直接处理,可以通过反射获取类的所有声明构造方法,逐一检查是否存在无参构造:
SearchConfig.forPaths(classPath) .by(ClassCriteria.create().allThoseThatMatch((cls) -> { // 先过滤带ManagedBean注解的类 if (!cls.isAnnotationPresent(ManagedBean.class)) { return false; } // 遍历所有声明的构造方法,检查是否存在无参构造 for (Constructor<?> constructor : cls.getDeclaredConstructors()) { if (constructor.getParameterCount() == 0) { // 存在无参构造,排除该类 return false; } } // 所有构造方法都带参,符合条件 return true; }) );
需要注意的是,这里用getDeclaredConstructors()获取的是类自身声明的所有构造方法(包括私有构造),如果类没有显式声明任何构造方法,编译器会自动生成一个默认无参构造,此时getDeclaredConstructors()会返回这个默认构造,这种类也会被正确排除。
内容的提问来源于stack exchange,提问作者KDV
相关产品推荐
相关产品推荐

