mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix code
This commit is contained in:
parent
04aea46294
commit
0f9000adcb
@ -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);
|
||||
|
@ -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} 工具类<br>
|
||||
* {@link ByteBuffer} 、{@link CharBuffer}工具类<br>
|
||||
* 此工具来自于 t-io 项目以及其它项目的相关部分收集<br>
|
||||
* ByteBuffer的相关介绍见:https://www.cnblogs.com/ruber/p/6857159.html
|
||||
*
|
@ -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;
|
||||
|
||||
/**
|
||||
* 代码移植自<a href="https://github.com/biezhi/blade">blade</a><br>
|
||||
@ -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) {
|
@ -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;
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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方法,规则为:<br>
|
||||
* <ul>
|
||||
* <li>方法参数必须为1个</li>
|
||||
* <li>判断是否以“set”开头</li>
|
||||
* </ul>
|
||||
*
|
||||
* @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方法,规则为:<br>
|
||||
* <ul>
|
||||
* <li>方法参数必须为0个</li>
|
||||
* <li>方法名称不能是getClass</li>
|
||||
* <li>"is"开头返回必须为boolean或Boolean</li>
|
||||
* <li>是否以“get”</li>
|
||||
* </ul>
|
||||
*
|
||||
* @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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user