diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java index d03c27233..781216a9e 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/bean/BeanDesc.java @@ -156,7 +156,8 @@ public class BeanDesc implements Serializable { PropDesc prop; for (final Field field : FieldUtil.getFields(this.beanClass)) { // 排除静态属性和对象子类 - if (!ModifierUtil.isStatic(field) && !FieldUtil.isOuterClassField(field)) { + if (!ModifierUtil.isStatic(field) && + !FieldUtil.isOuterClassField(field)) { prop = createProp(field, gettersAndSetters); // 只有不存在时才放入,防止父类属性覆盖子类属性 this.propMap.putIfAbsent(prop.getFieldName(), prop); diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/BufferUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/BufferUtil.java similarity index 98% rename from hutool-core/src/main/java/org/dromara/hutool/core/io/BufferUtil.java rename to hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/BufferUtil.java index d72e6ebfb..d384ec342 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/BufferUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/BufferUtil.java @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.io; +package org.dromara.hutool.core.io.buffer; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ByteUtil; @@ -23,7 +23,7 @@ import java.nio.charset.Charset; import java.util.Arrays; /** - * {@link ByteBuffer} 工具类
+ * {@link ByteBuffer} 、{@link CharBuffer}工具类
* 此工具来自于 t-io 项目以及其它项目的相关部分收集
* ByteBuffer的相关介绍见:https://www.cnblogs.com/ruber/p/6857159.html * diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/FastByteBuffer.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastByteBuffer.java similarity index 93% rename from hutool-core/src/main/java/org/dromara/hutool/core/io/FastByteBuffer.java rename to hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastByteBuffer.java index af3ce180f..23b89d2a1 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/FastByteBuffer.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/FastByteBuffer.java @@ -10,7 +10,7 @@ * See the Mulan PSL v2 for more details. */ -package org.dromara.hutool.core.io; +package org.dromara.hutool.core.io.buffer; /** * 代码移植自blade
@@ -51,12 +51,20 @@ public class FastByteBuffer { */ private final int minChunkLen; + /** + * 构造 + */ public FastByteBuffer() { this(1024); } + /** + * 构造 + * + * @param size 一个缓冲区的最小字节数 + */ public FastByteBuffer(int size) { - if(size <= 0){ + if (size <= 0) { size = 1024; } this.minChunkLen = Math.abs(size); @@ -90,8 +98,8 @@ public class FastByteBuffer { * 向快速缓冲加入数据 * * @param array 数据 - * @param off 偏移量 - * @param len 字节数 + * @param off 偏移量 + * @param len 字节数 * @return 快速缓冲自身 @see FastByteBuffer */ public FastByteBuffer append(final byte[] array, final int off, final int len) { @@ -134,7 +142,6 @@ public class FastByteBuffer { * 向快速缓冲加入数据 * * @param array 数据 - * * @return 快速缓冲自身 @see FastByteBuffer */ public FastByteBuffer append(final byte[] array) { @@ -176,10 +183,20 @@ public class FastByteBuffer { return this; } + /** + * 长度 + * + * @return 长度 + */ public int size() { return size; } + /** + * 是否为空 + * + * @return 是否为空 + */ public boolean isEmpty() { return size == 0; } @@ -193,6 +210,11 @@ public class FastByteBuffer { return currentBufferIndex; } + /** + * 获取当前缓冲偏移量 + * + * @return 当前缓冲偏移量 + */ public int offset() { return offset; } @@ -207,6 +229,9 @@ public class FastByteBuffer { return buffers[index]; } + /** + * 复位缓冲 + */ public void reset() { size = 0; offset = 0; @@ -243,7 +268,7 @@ public class FastByteBuffer { * 返回快速缓冲中的数据 * * @param start 逻辑起始位置 - * @param len 逻辑字节长 + * @param len 逻辑字节长 * @return 快速缓冲中的数据 */ public byte[] toArray(int start, final int len) { diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/package-info.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/package-info.java new file mode 100644 index 000000000..7d0fcafc1 --- /dev/null +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/buffer/package-info.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2023 looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/** + * {@link java.nio.Buffer}相关工具封装 + * + * @author looly + */ +package org.dromara.hutool.core.io.buffer; diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/io/stream/FastByteArrayOutputStream.java b/hutool-core/src/main/java/org/dromara/hutool/core/io/stream/FastByteArrayOutputStream.java index cc7498444..b1e11f340 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/io/stream/FastByteArrayOutputStream.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/io/stream/FastByteArrayOutputStream.java @@ -12,7 +12,7 @@ package org.dromara.hutool.core.io.stream; -import org.dromara.hutool.core.io.FastByteBuffer; +import org.dromara.hutool.core.io.buffer.FastByteBuffer; import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.util.CharsetUtil; import org.dromara.hutool.core.util.ObjUtil; @@ -62,6 +62,11 @@ public class FastByteArrayOutputStream extends OutputStream { buffer.append((byte) b); } + /** + * 长度 + * + * @return 长度 + */ public int size() { return buffer.size(); } @@ -74,18 +79,22 @@ public class FastByteArrayOutputStream extends OutputStream { // nop } + /** + * 复位 + */ public void reset() { buffer.reset(); } /** * 写出 + * * @param out 输出流 * @throws IORuntimeException IO异常 */ public void writeTo(final OutputStream out) throws IORuntimeException { final int index = buffer.index(); - if(index < 0){ + if (index < 0) { // 无数据写出 return; } @@ -104,6 +113,7 @@ public class FastByteArrayOutputStream extends OutputStream { /** * 转为Byte数组 + * * @return Byte数组 */ public byte[] toByteArray() { @@ -117,12 +127,13 @@ public class FastByteArrayOutputStream extends OutputStream { /** * 转为字符串 + * * @param charset 编码,null表示默认编码 * @return 字符串 */ public String toString(final Charset charset) { return new String(toByteArray(), - ObjUtil.defaultIfNull(charset, CharsetUtil::defaultCharset)); + ObjUtil.defaultIfNull(charset, CharsetUtil::defaultCharset)); } } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/MethodUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/MethodUtil.java index 0c6e31d25..3f528aca4 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/MethodUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/MethodUtil.java @@ -24,6 +24,7 @@ import org.dromara.hutool.core.lang.Singleton; import org.dromara.hutool.core.map.WeakConcurrentMap; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.array.ArrayUtil; +import org.dromara.hutool.core.util.BooleanUtil; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -215,10 +216,10 @@ public class MethodUtil { if (ArrayUtil.isNotEmpty(methods)) { for (final Method method : methods) { if (StrUtil.equals(methodName, method.getName(), ignoreCase) - && ClassUtil.isAllAssignableFrom(method.getParameterTypes(), paramTypes) - //排除桥接方法,pr#1965@Github - //排除协变桥接方法,pr#1965@Github - && (res == null || res.getReturnType().isAssignableFrom(method.getReturnType()))) { + && ClassUtil.isAllAssignableFrom(method.getParameterTypes(), paramTypes) + //排除桥接方法,pr#1965@Github + //排除协变桥接方法,pr#1965@Github + && (res == null || res.getReturnType().isAssignableFrom(method.getReturnType()))) { res = method; } } @@ -284,8 +285,8 @@ public class MethodUtil { if (ArrayUtil.isNotEmpty(methods)) { for (final Method method : methods) { if (StrUtil.equals(methodName, method.getName(), ignoreCase) - //排除协变桥接方法,pr#1965@Github - && (res == null || res.getReturnType().isAssignableFrom(method.getReturnType()))) { + //排除协变桥接方法,pr#1965@Github + && (res == null || res.getReturnType().isAssignableFrom(method.getReturnType()))) { res = method; } } @@ -335,7 +336,7 @@ public class MethodUtil { public static Method[] getMethods(final Class beanClass) throws SecurityException { Assert.notNull(beanClass); return METHODS_CACHE.computeIfAbsent(beanClass, - (key) -> getMethodsDirectly(beanClass, true, true)); + (key) -> getMethodsDirectly(beanClass, true, true)); } /** @@ -348,7 +349,7 @@ public class MethodUtil { public static Method[] getDeclaredMethods(final Class beanClass) throws SecurityException { Assert.notNull(beanClass); return DECLARED_METHODS_CACHE.computeIfAbsent(beanClass, - key -> getMethodsDirectly(beanClass, false, Objects.equals(Object.class, beanClass))); + key -> getMethodsDirectly(beanClass, false, Objects.equals(Object.class, beanClass))); } /** @@ -398,8 +399,8 @@ public class MethodUtil { */ public static boolean isEqualsMethod(final Method method) { if (method == null || - 1 != method.getParameterCount() || - !"equals".equals(method.getName())) { + 1 != method.getParameterCount() || + !"equals".equals(method.getName())) { return false; } return (method.getParameterTypes()[0] == Object.class); @@ -413,8 +414,8 @@ public class MethodUtil { */ public static boolean isHashCodeMethod(final Method method) { return method != null// - && "hashCode".equals(method.getName())// - && isEmptyParam(method); + && "hashCode".equals(method.getName())// + && isEmptyParam(method); } /** @@ -425,8 +426,8 @@ public class MethodUtil { */ public static boolean isToStringMethod(final Method method) { return method != null// - && "toString".equals(method.getName())// - && isEmptyParam(method); + && "toString".equals(method.getName())// + && isEmptyParam(method); } /** @@ -471,32 +472,91 @@ public class MethodUtil { * @since 5.7.20 */ public static boolean isGetterOrSetter(final Method method, final boolean ignoreCase) { + // 参数个数必须为1 + final int parameterCount = method.getParameterCount(); + switch (parameterCount){ + case 0: + return isGetter(method, ignoreCase); + case 1: + return isSetter(method, ignoreCase); + default: + return false; + } + } + + /** + * 检查给定方法是否为Setter方法,规则为:
+ * + * + * @param method 方法 + * @param ignoreCase 是否忽略方法名的大小写 + * @return 是否为Setter方法 + */ + public static boolean isSetter(final Method method, final boolean ignoreCase) { + if (null == method) { + return false; + } + + // 参数个数必须为1 + final int parameterCount = method.getParameterCount(); + if (1 != parameterCount) { + return false; + } + + String name = method.getName(); + // 跳过set这类特殊方法 + if ("set".equals(name)) { + return false; + } + + if (ignoreCase) { + name = name.toLowerCase(); + } + return name.startsWith("set"); + } + + /** + * 检查给定方法是否为Getter方法,规则为:
+ * + * + * @param method 方法 + * @param ignoreCase 是否忽略方法名的大小写 + * @return 是否为Getter方法 + */ + public static boolean isGetter(final Method method, final boolean ignoreCase) { if (null == method) { return false; } // 参数个数必须为0或1 final int parameterCount = method.getParameterCount(); - if (parameterCount > 1) { + if (0 != parameterCount) { return false; } String name = method.getName(); - // 跳过getClass这个特殊方法 - if ("getClass".equals(name)) { + // 跳过getClass、get、is这类特殊方法 + if ("getClass".equals(name) || "get".equals(name) || "is".equals(name)) { return false; } + if (ignoreCase) { name = name.toLowerCase(); } - switch (parameterCount) { - case 0: - return name.startsWith("get") || name.startsWith("is"); - case 1: - return name.startsWith("set"); - default: - return false; + + if (name.startsWith("is")) { + // 判断返回值是否为Boolean + return BooleanUtil.isBoolean(method.getReturnType()); } + return name.startsWith("get"); } // --------------------------------------------------------------------------------------------------------- invoke diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/io/BufferUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/io/BufferUtilTest.java index 5b03004eb..f017d455c 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/io/BufferUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/io/BufferUtilTest.java @@ -2,6 +2,7 @@ package org.dromara.hutool.core.io; import java.nio.ByteBuffer; +import org.dromara.hutool.core.io.buffer.BufferUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.CharsetUtil; import org.junit.jupiter.api.Assertions; diff --git a/hutool-socket/src/test/java/org/dromara/hutool/socket/aio/AioServerTest.java b/hutool-socket/src/test/java/org/dromara/hutool/socket/aio/AioServerTest.java index c8705ab8b..3bb0cafb1 100644 --- a/hutool-socket/src/test/java/org/dromara/hutool/socket/aio/AioServerTest.java +++ b/hutool-socket/src/test/java/org/dromara/hutool/socket/aio/AioServerTest.java @@ -1,7 +1,7 @@ package org.dromara.hutool.socket.aio; import org.dromara.hutool.core.date.DateUtil; -import org.dromara.hutool.core.io.BufferUtil; +import org.dromara.hutool.core.io.buffer.BufferUtil; import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.log.StaticLog; diff --git a/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioClientTest.java b/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioClientTest.java index 2590622a9..342e99045 100644 --- a/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioClientTest.java +++ b/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioClientTest.java @@ -1,6 +1,6 @@ package org.dromara.hutool.socket.nio; -import org.dromara.hutool.core.io.BufferUtil; +import org.dromara.hutool.core.io.buffer.BufferUtil; import org.dromara.hutool.core.lang.Console; import org.dromara.hutool.core.text.StrUtil; import lombok.SneakyThrows; diff --git a/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioServerTest.java b/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioServerTest.java index 2103afa8a..ad7c0f2ba 100644 --- a/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioServerTest.java +++ b/hutool-socket/src/test/java/org/dromara/hutool/socket/nio/NioServerTest.java @@ -1,6 +1,6 @@ package org.dromara.hutool.socket.nio; -import org.dromara.hutool.core.io.BufferUtil; +import org.dromara.hutool.core.io.buffer.BufferUtil; import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.lang.Console;