diff --git a/CHANGELOG.md b/CHANGELOG.md
index 24f725873..84b31c3a4 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
-# 5.8.33(2024-09-09)
+# 5.8.33(2024-09-11)
### 🐣新特性
* 【core 】 SyncFinisher增加setExecutorService方法(issue#IANKQ1@Gitee)
@@ -10,6 +10,7 @@
* 【core 】 用ArrayList重新实现权重随机类:WeightListRandom(pr#3720@Github)
* 【crypto 】 SM2解密时,兼容GmSSL非压缩省略的04头的密文(issue#IAP1QJ@Gitee)
* 【core 】 兼容NumberUtil.add方法传入整型自动类型转换为浮点类型的精度丢失问题(pr#3721@Github)
+* 【core 】 ModifierUtil明确注释,并增加hasAllModifiers方法(issue#IAQ2U0@Gitee)
### 🐞Bug修复
* 【json 】 修复JSONConfig.setDateFormat设置后toBean无效问题(issue#3713@Github)
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java
index 5364d2f8b..4855c05ab 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java
@@ -2,10 +2,7 @@ package cn.hutool.core.util;
import cn.hutool.core.exceptions.UtilException;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
+import java.lang.reflect.*;
/**
* 修饰符工具类
@@ -93,10 +90,16 @@ public class ModifierUtil {
}
/**
- * 是否同时存在一个或多个修饰符(可能有多个修饰符,如果有指定的修饰符则返回true)
+ * 类是否存在给定修饰符中的任意一个
+ * 如定义修饰符为:{@code public static final},那么如果传入的modifierTypes为:
+ *
+ * - public、static 返回{@code true}
+ * - public、abstract返回{@code true}
+ * - private、abstract返回{@code false}
+ *
*
- * @param clazz 类
- * @param modifierTypes 修饰符枚举
+ * @param clazz 类,如果为{@code null}返回{@code false}
+ * @param modifierTypes 修饰符枚举,如果为空返回{@code false}
* @return 是否有指定修饰符,如果有返回true,否则false,如果提供参数为null返回false
*/
public static boolean hasModifier(Class> clazz, ModifierType... modifierTypes) {
@@ -107,10 +110,16 @@ public class ModifierUtil {
}
/**
- * 是否同时存在一个或多个修饰符(可能有多个修饰符,如果有指定的修饰符则返回true)
+ * 构造是否存在给定修饰符中的任意一个
+ * 如定义修饰符为:{@code public static final},那么如果传入的modifierTypes为:
+ *
+ * - public、static 返回{@code true}
+ * - public、abstract返回{@code true}
+ * - private、abstract返回{@code false}
+ *
*
- * @param constructor 构造方法
- * @param modifierTypes 修饰符枚举
+ * @param constructor 构造,如果为{@code null}返回{@code false}
+ * @param modifierTypes 修饰符枚举,如果为空返回{@code false}
* @return 是否有指定修饰符,如果有返回true,否则false,如果提供参数为null返回false
*/
public static boolean hasModifier(Constructor> constructor, ModifierType... modifierTypes) {
@@ -121,10 +130,16 @@ public class ModifierUtil {
}
/**
- * 是否同时存在一个或多个修饰符(可能有多个修饰符,如果有指定的修饰符则返回true)
+ * 方法是否存在给定修饰符中的任意一个
+ * 如定义修饰符为:{@code public static final},那么如果传入的modifierTypes为:
+ *
+ * - public、static 返回{@code true}
+ * - public、abstract返回{@code true}
+ * - private、abstract返回{@code false}
+ *
*
- * @param method 方法
- * @param modifierTypes 修饰符枚举
+ * @param method 方法,如果为{@code null}返回{@code false}
+ * @param modifierTypes 修饰符枚举,如果为空返回{@code false}
* @return 是否有指定修饰符,如果有返回true,否则false,如果提供参数为null返回false
*/
public static boolean hasModifier(Method method, ModifierType... modifierTypes) {
@@ -135,10 +150,16 @@ public class ModifierUtil {
}
/**
- * 是否同时存在一个或多个修饰符(可能有多个修饰符,如果有指定的修饰符则返回true)
+ * 字段是否存在给定修饰符中的任意一个
+ * 如定义修饰符为:{@code public static final},那么如果传入的modifierTypes为:
+ *
+ * - public、static 返回{@code true}
+ * - public、abstract返回{@code true}
+ * - private、abstract返回{@code false}
+ *
*
- * @param field 字段
- * @param modifierTypes 修饰符枚举
+ * @param field 构造、字段或方法,如果为{@code null}返回{@code false}
+ * @param modifierTypes 修饰符枚举,如果为空返回{@code false}
* @return 是否有指定修饰符,如果有返回true,否则false,如果提供参数为null返回false
*/
public static boolean hasModifier(Field field, ModifierType... modifierTypes) {
@@ -148,6 +169,51 @@ public class ModifierUtil {
return 0 != (field.getModifiers() & modifiersToInt(modifierTypes));
}
+ // region ----- hasAll
+
+ /**
+ * 类中是否同时存在所有给定修饰符
+ * 如定义修饰符为:{@code public static final},那么如果传入的modifierTypes为:
+ *
+ * - public、static 返回{@code true}
+ * - public、abstract返回{@code false}
+ * - private、abstract返回{@code false}
+ *
+ *
+ * @param clazz 类,如果为{@code null}返回{@code false}
+ * @param modifierTypes 修饰符枚举,如果为空返回{@code false}
+ * @return 是否同时存在所有指定修饰符,如果有返回true,否则false,如果提供参数为null返回false
+ */
+ public static boolean hasAllModifiers(final Class> clazz, final ModifierType... modifierTypes) {
+ if (null == clazz || ArrayUtil.isEmpty(modifierTypes)) {
+ return false;
+ }
+ final int checkedModifiersInt = modifiersToInt(modifierTypes);
+ return checkedModifiersInt == (clazz.getModifiers() & checkedModifiersInt);
+ }
+
+ /**
+ * 成员中是否同时存在所有给定修饰符
+ * 如定义修饰符为:{@code public static final},那么如果传入的modifierTypes为:
+ *
+ * - public、static 返回{@code true}
+ * - public、abstract返回{@code false}
+ * - private、abstract返回{@code false}
+ *
+ *
+ * @param member 构造、字段或方法,如果为{@code null}返回{@code false}
+ * @param modifierTypes 修饰符枚举,如果为空返回{@code false}
+ * @return 是否同时存在所有指定修饰符,如果有返回true,否则false,如果提供参数为null返回false
+ */
+ public static boolean hasAllModifiers(final Member member, final ModifierType... modifierTypes) {
+ if (null == member || ArrayUtil.isEmpty(modifierTypes)) {
+ return false;
+ }
+ final int checkedModifiersInt = modifiersToInt(modifierTypes);
+ return checkedModifiersInt == (member.getModifiers() & checkedModifiersInt);
+ }
+ // endregion
+
/**
* 是否是Public字段
*
@@ -273,7 +339,7 @@ public class ModifierUtil {
* 基本类型 byte, char, short, int, long, float, double, boolean
* Literal String 类型(直接双引号字符串)
*
- * 以下属性,可以通过反射修改:
+ * 以下属性,可以通过反射修改:
*
* - 基本类型的包装类 Byte、Character、Short、Long、Float、Double、Boolean
* - 字符串,通过 new String("")实例化
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ModifierUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ModifierUtilTest.java
index f7315e5c3..0f04c177f 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/ModifierUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/ModifierUtilTest.java
@@ -1,10 +1,12 @@
package cn.hutool.core.util;
-import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.lang.reflect.Method;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
public class ModifierUtilTest {
@Test
@@ -16,6 +18,36 @@ public class ModifierUtilTest {
ModifierUtil.ModifierType.STATIC)
);
}
+
+ @Test
+ public void hasModifierTest2() throws NoSuchMethodException {
+ Method method = ModifierUtilTest.class.getDeclaredMethod("ddd");
+ assertTrue(ModifierUtil.hasModifier(method, ModifierUtil.ModifierType.PRIVATE));
+ assertTrue(ModifierUtil.hasModifier(method,
+ ModifierUtil.ModifierType.PRIVATE,
+ ModifierUtil.ModifierType.ABSTRACT)
+ );
+ }
+
+ @Test
+ void issueIAQ2U0Test() throws NoSuchMethodException {
+ final Method method = ModifierUtilTest.class.getDeclaredMethod("ddd");
+
+ Assertions.assertTrue(ModifierUtil.hasModifier(method,
+ ModifierUtil.ModifierType.PRIVATE,
+ ModifierUtil.ModifierType.STATIC,
+ // 不存在
+ ModifierUtil.ModifierType.TRANSIENT
+ ));
+
+ Assertions.assertFalse(ModifierUtil.hasAllModifiers(method,
+ ModifierUtil.ModifierType.PRIVATE,
+ ModifierUtil.ModifierType.STATIC,
+ // 不存在
+ ModifierUtil.ModifierType.TRANSIENT
+ ));
+ }
+
private static void ddd() {
}
}