ModifierUtil明确注释,并增加hasAllModifiers方法

This commit is contained in:
Looly 2024-09-11 13:18:19 +08:00
parent ca30287f2a
commit 6ebca582f1
3 changed files with 118 additions and 19 deletions

View File

@ -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重新实现权重随机类WeightListRandompr#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

View File

@ -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
* 类是否存在给定修饰符中的<b>任意一个</b><br>
* 如定义修饰符为{@code public static final}那么如果传入的modifierTypes为
* <ul>
* <li>publicstatic 返回{@code true}</li>
* <li>publicabstract返回{@code true}</li>
* <li>privateabstract返回{@code false}</li>
* </ul>
*
* @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
* 构造是否存在给定修饰符中的<b>任意一个</b><br>
* 如定义修饰符为{@code public static final}那么如果传入的modifierTypes为
* <ul>
* <li>publicstatic 返回{@code true}</li>
* <li>publicabstract返回{@code true}</li>
* <li>privateabstract返回{@code false}</li>
* </ul>
*
* @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
* 方法是否存在给定修饰符中的<b>任意一个</b><br>
* 如定义修饰符为{@code public static final}那么如果传入的modifierTypes为
* <ul>
* <li>publicstatic 返回{@code true}</li>
* <li>publicabstract返回{@code true}</li>
* <li>privateabstract返回{@code false}</li>
* </ul>
*
* @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
* 字段是否存在给定修饰符中的<b>任意一个</b><br>
* 如定义修饰符为{@code public static final}那么如果传入的modifierTypes为
* <ul>
* <li>publicstatic 返回{@code true}</li>
* <li>publicabstract返回{@code true}</li>
* <li>privateabstract返回{@code false}</li>
* </ul>
*
* @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
/**
* 类中是否同时存在<b>所有</b>给定修饰符<br>
* 如定义修饰符为{@code public static final}那么如果传入的modifierTypes为
* <ul>
* <li>publicstatic 返回{@code true}</li>
* <li>publicabstract返回{@code false}</li>
* <li>privateabstract返回{@code false}</li>
* </ul>
*
* @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);
}
/**
* 成员中是否同时存在<b>所有</b>给定修饰符<br>
* 如定义修饰符为{@code public static final}那么如果传入的modifierTypes为
* <ul>
* <li>publicstatic 返回{@code true}</li>
* <li>publicabstract返回{@code false}</li>
* <li>privateabstract返回{@code false}</li>
* </ul>
*
* @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 {
* <li> 基本类型 byte, char, short, int, long, float, double, boolean</li>
* <li> Literal String 类型(直接双引号字符串)</li>
* </ul>
* <h3>以下属性可以通过反射修改</h3>
* <p>以下属性可以通过反射修改</p>
* <ul>
* <li>基本类型的包装类 ByteCharacterShortLongFloatDoubleBoolean</li>
* <li>字符串通过 new String("")实例化</li>

View File

@ -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() {
}
}