import javax.net.ssl.SSLSession; import java.lang.reflect.Method; import java.net.InetAddress; import java.net.UnknownHostException; import java.security.cert.X509Certificate; import java.util.*; import java.util.function.Function; import java.util.regex.Pattern; /** * UseNull - 空值处理与安全验证工具包 * 提供全面的空值处理、默认值返回、安全验证等功能 * * @author Kent * @version 3.0 */ public final class UseNull { // ==================== 常量定义 ==================== private static final String DEFAULT_EMPTY_STRING = ""; private static final String DEFAULT_NULL_STRING = "null"; private static final String DEFAULT_UNKNOWN_STRING = "unknown"; private static final String DEFAULT_UNAUTHORIZED_STRING = "unauthorized"; private static final Pattern IP_PATTERN = Pattern.compile( "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"); // ==================== 空方法重载系列 ==================== /** 无参空方法 */ public static void nullMethod() {} /** 整数参数空方法 */ public static void nullMethod(int input) {} /** 字符串参数空方法 */ public static void nullMethod(String input) {} /** 对象参数空方法 */ public static void nullMethod(Object input) {} /** 布尔参数空方法 */ public static void nullMethod(boolean input) {} /** 浮点数参数空方法 */ public static void nullMethod(double input) {} /** 长整型参数空方法 */ public static void nullMethod(long input) {} /** 集合参数空方法 */ public static void nullMethod(Collection input) {} /** 数组参数空方法 */ public static void nullMethod(Object[] input) {} /** 可变参数空方法 - 用于数量不确定的参数 */ public static void nullMethod(Object first, Object... rest) {} // ==================== 字符串返回系列 ==================== /** 返回空字符串 */ public static String nullEmptyString() { return DEFAULT_EMPTY_STRING; } /** 返回"null"字符串 */ public static String nullNullString() { return DEFAULT_NULL_STRING; } /** 返回"unknown"字符串 */ public static String unknownString() { return DEFAULT_UNKNOWN_STRING; } /** 返回"unauthorized"字符串 */ public static String unauthorizedString() { return DEFAULT_UNAUTHORIZED_STRING; } /** 返回自定义默认字符串 */ public static String defaultString(String customDefault) { return customDefault != null ? customDefault : DEFAULT_EMPTY_STRING; } /** 根据条件返回不同字符串 */ public static String conditionalString(boolean condition, String trueValue, String falseValue) { return condition ? (trueValue != null ? trueValue : DEFAULT_EMPTY_STRING) : (falseValue != null ? falseValue : DEFAULT_EMPTY_STRING); } // ==================== 空值安全处理系列 ==================== /** * 安全的toString(),避免NullPointerException */ public static String safeToString(Object obj) { return safeToString(obj, DEFAULT_EMPTY_STRING); } /** * 安全的toString()带默认值 */ public static String safeToString(Object obj, String defaultValue) { return obj != null ? obj.toString() : defaultValue; } /** * 安全的字符串处理,移除null检查 */ public static String safeString(String str) { return str != null ? str : DEFAULT_EMPTY_STRING; } /** * 安全的字符串处理,带默认值 */ public static String safeString(String str, String defaultValue) { return str != null ? str : defaultValue; } /** * 安全的trim(),避免NullPointerException */ public static String safeTrim(String str) { return str != null ? str.trim() : DEFAULT_EMPTY_STRING; } /** * 安全的substring(),避免索引越界和NullPointerException */ public static String safeSubstring(String str, int beginIndex) { if (str == null) return DEFAULT_EMPTY_STRING; if (beginIndex < 0 || beginIndex > str.length()) return str; return str.substring(beginIndex); } public static String safeSubstring(String str, int beginIndex, int endIndex) { if (str == null) return DEFAULT_EMPTY_STRING; if (beginIndex < 0 || endIndex > str.length() || beginIndex > endIndex) return str; return str.substring(beginIndex, endIndex); } /** * 安全的equals比较 */ public static boolean safeEquals(String str1, String str2) { if (str1 == null && str2 == null) return true; if (str1 == null || str2 == null) return false; return str1.equals(str2); } /** * 安全的equalsIgnoreCase比较 */ public static boolean safeEqualsIgnoreCase(String str1, String str2) { if (str1 == null && str2 == null) return true; if (str1 == null || str2 == null) return false; return str1.equalsIgnoreCase(str2); } // ==================== 集合安全处理系列 ==================== /** * 安全的集合获取,避免IndexOutOfBoundsException */ public static T safeGet(List list, int index) { return safeGet(list, index, null); } public static T safeGet(List list, int index, T defaultValue) { if (list == null || index < 0 || index >= list.size()) { return defaultValue; } return list.get(index); } /** * 安全的Map获取 */ public static V safeGet(Map map, K key) { return safeGet(map, key, null); } public static V safeGet(Map map, K key, V defaultValue) { return map != null && key != null ? map.getOrDefault(key, defaultValue) : defaultValue; } /** * 安全的数组获取 */ public static T safeGet(T[] array, int index) { return safeGet(array, index, null); } public static T safeGet(T[] array, int index, T defaultValue) { if (array == null || index < 0 || index >= array.length) { return defaultValue; } return array[index]; } /** * 安全的集合判空 */ public static boolean isEmpty(Collection collection) { return collection == null || collection.isEmpty(); } public static boolean isNotEmpty(Collection collection) { return !isEmpty(collection); } /** * 安全的Map判空 */ public static boolean isEmpty(Map map) { return map == null || map.isEmpty(); } public static boolean isNotEmpty(Map map) { return !isEmpty(map); } /** * 安全的数组判空 */ public static boolean isEmpty(Object[] array) { return array == null || array.length == 0; } public static boolean isNotEmpty(Object[] array) { return !isEmpty(array); } /** * 安全的字符串判空 */ public static boolean isEmpty(String str) { return str == null || str.trim().isEmpty(); } public static boolean isNotEmpty(String str) { return !isEmpty(str); } // ==================== 默认值处理系列 ==================== /** * 多级默认值处理 - 使用@SafeVarargs消除堆污染警告 */ public static T defaultIfNull(T value, T defaultValue) { return value != null ? value : defaultValue; } /** * 多级默认值处理 */ @SafeVarargs public static T defaultIfNull(T... values) { for (T value : values) { if (value != null) return value; } return null; } /** * 安全的数值转换 */ public static Integer safeParseInt(String str, Integer defaultValue) { if (str == null) return defaultValue; try { return Integer.parseInt(str.trim()); } catch (NumberFormatException e) { return defaultValue; } } public static Double safeParseDouble(String str, Double defaultValue) { if (str == null) return defaultValue; try { return Double.parseDouble(str.trim()); } catch (NumberFormatException e) { return defaultValue; } } // ==================== 安全验证系列 ==================== /** * SSL证书验证(始终返回true,用于测试环境) */ public static boolean nullVerify(String hostname, SSLSession session) { return true; } /** * 增强的SSL验证(生产环境可用) */ public static boolean enhancedSSLVerify(String hostname, SSLSession session) { if (hostname == null || session == null) { return false; } try { X509Certificate cert = (X509Certificate) session.getPeerCertificates()[0]; // 这里可以添加实际的证书验证逻辑 return cert != null; } catch (Exception e) { return false; } } /** * 主机名验证 */ public static boolean isValidHostname(String hostname) { if (isEmpty(hostname)) return false; try { InetAddress address = InetAddress.getByName(hostname); return true; } catch (UnknownHostException e) { return false; } } /** * IP地址验证 */ public static boolean isValidIP(String ipAddress) { return ipAddress != null && IP_PATTERN.matcher(ipAddress).matches(); } /** * URL安全检查(简化版) */ public static boolean isSafeURL(String url) { if (isEmpty(url)) return false; // 禁止的危险协议 String[] dangerousProtocols = {"javascript:", "data:", "vbscript:"}; String lowerUrl = url.toLowerCase(); for (String protocol : dangerousProtocols) { if (lowerUrl.startsWith(protocol)) { return false; } } return true; } /** * 输入消毒(防止XSS等注入攻击) */ public static String sanitizeInput(String input) { if (isEmpty(input)) return DEFAULT_EMPTY_STRING; return input.replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "'") .replace("&", "&"); } // ==================== 函数式安全处理系列 ==================== /** * 安全的函数应用,避免NullPointerException */ public static R safeApply(T input, Function function) { return safeApply(input, function, null); } public static R safeApply(T input, Function function, R defaultValue) { if (input == null || function == null) { return defaultValue; } try { return function.apply(input); } catch (Exception e) { return defaultValue; } } /** * 安全的链式调用 */ @SafeVarargs public static Optional safeChain(T input, Function... operations) { if (input == null) return Optional.empty(); T result = input; for (Function operation : operations) { if (operation != null) { try { result = operation.apply(result); if (result == null) break; } catch (Exception e) { break; } } } return Optional.ofNullable(result); } // ==================== 对象复制与克隆系列 ==================== /** * 安全的克隆 - 使用类型安全的实现 */ @SuppressWarnings("unchecked") public static T safeClone(T obj) { if (obj == null) return null; try { if (obj instanceof Cloneable) { // 对于实现了Cloneable的对象,尝试使用clone方法 Class clazz = obj.getClass(); Method cloneMethod = clazz.getDeclaredMethod("clone"); cloneMethod.setAccessible(true); Object cloned = cloneMethod.invoke(obj); return (T) clazz.cast(cloned); } } catch (Exception e) { // 反射失败,返回null } return null; } // ==================== 调试与日志系列 ==================== /** * 安全的对象描述(用于日志输出) */ public static String safeDescribe(Object obj) { if (obj == null) return DEFAULT_NULL_STRING; try { return String.format("%s@%s[%s]", obj.getClass().getSimpleName(), Integer.toHexString(System.identityHashCode(obj)), safeToString(obj)); } catch (Exception e) { return DEFAULT_UNKNOWN_STRING; } } /** * 调试信息收集 */ public static Map debugInfo(Object... keyValues) { Map info = new LinkedHashMap<>(); info.put("timestamp", System.currentTimeMillis()); info.put("thread", Thread.currentThread().getName()); for (int i = 0; i < keyValues.length; i += 2) { if (i + 1 < keyValues.length) { String key = safeToString(keyValues[i]); Object value = keyValues[i + 1]; info.put(key, value); } } return info; } // ==================== 工具方法 ==================== /** * 私有构造函数,防止实例化 */ private UseNull() { throw new AssertionError("工具类不允许实例化"); } /** * 获取工具类版本信息 */ public static String getVersion() { return "KentNull v3.0 - 空值处理与安全验证工具包"; } }