This commit is contained in:
redkale
2024-09-28 08:58:21 +08:00
parent 84177f43f4
commit d245f134b7
18 changed files with 164 additions and 207 deletions

View File

@@ -595,7 +595,7 @@ public final class ApiDocCommand {
if (col != null) {
desc = col.comment();
if (!col.nullable()) {
requireds.add(member.getAttribute().field());
requireds.add(member.getFieldName());
}
}
if (desc.isEmpty() && member.getField().getAnnotation(Comment.class) != null) {
@@ -613,7 +613,7 @@ public final class ApiDocCommand {
if (col != null) {
desc = col.comment();
if (!col.nullable()) {
requireds.add(member.getAttribute().field());
requireds.add(member.getFieldName());
}
}
if (desc.isEmpty() && member.getMethod().getAnnotation(Comment.class) != null) {
@@ -630,7 +630,7 @@ public final class ApiDocCommand {
if (!desc.isEmpty()) {
schemaMap.put("description", desc);
}
properties.put(member.getAttribute().field(), schemaMap);
properties.put(member.getFieldName(), schemaMap);
}
}
if (!requireds.isEmpty()) {
@@ -899,7 +899,7 @@ public final class ApiDocCommand {
if (index > 0) {
json.append(",");
}
json.append('"').append(member.getAttribute().field()).append("\":{}");
json.append('"').append(member.getFieldName()).append("\":{}");
index++;
}
json.append("}");

View File

@@ -119,6 +119,10 @@ public final class DeMember<R extends Reader, T, F> {
return ((TagDecodeable<R, F>) decoder).convertFrom(in, this);
}
public String getFieldName() {
return this.attribute.field();
}
public Attribute<T, F> getAttribute() {
return this.attribute;
}

View File

@@ -30,7 +30,7 @@ public class DeMemberInfo {
this.memberFieldMap = new HashMap<>(deMembers.length);
this.memberTagMap = new HashMap<>(deMembers.length);
for (DeMember member : deMembers) {
this.memberFieldMap.put(member.getAttribute().field(), member);
this.memberFieldMap.put(member.getFieldName(), member);
this.memberTagMap.put(member.getTag(), member);
}
this.memberNode = DeMemberNode.create(deMembers);

View File

@@ -137,6 +137,10 @@ public final class EnMember<W extends Writer, T, F> {
return attribute.field().equals(name);
}
public String getFieldName() {
return this.attribute.field();
}
public Attribute<T, F> getAttribute() {
return attribute;
}

View File

@@ -359,13 +359,12 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
@Override
public T convertFrom(final R in) {
this.checkInited();
R objin = objectReader(in);
final String clazz = objin.readObjectB(typeClass);
final String clazz = in.readObjectB(typeClass);
if (clazz == null) {
return null;
}
if (!clazz.isEmpty()) {
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(objin);
return (T) factory.loadDecoder(factory.getEntityAlias(clazz)).convertFrom(in);
}
if (this.creator == null) {
if (typeClass.isInterface() || Modifier.isAbstract(typeClass.getModifiers())) {
@@ -378,18 +377,17 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
if (this.creatorConstructorMembers == null) { // 空构造函数
final T result = this.creator == null ? null : this.creator.create();
boolean first = true;
while (objin.hasNext()) {
DeMember member = objin.readFieldName(info);
objin.readBlank();
while (in.hasNext()) {
DeMember member = in.readFieldName(info);
in.readBlank();
if (member == null) {
objin.skipValue(); // 跳过不存在的属性的值
in.skipValue(); // 跳过不存在的属性的值
} else {
readDeMemberValue(objin, member, result, first);
readDeMemberValue(in, member, result, first);
}
first = false;
}
objin.readObjectE(typeClass);
offerReader(in, objin);
in.readObjectE(typeClass);
return result;
} else { // 带参数的构造函数
final DeMember<R, T, ?>[] constructorFields = this.creatorConstructorMembers;
@@ -397,13 +395,13 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
final Object[][] otherParams = new Object[info.length()][2];
int oc = 0;
boolean first = true;
while (objin.hasNext()) {
DeMember member = objin.readFieldName(info);
objin.readBlank();
while (in.hasNext()) {
DeMember member = in.readFieldName(info);
in.readBlank();
if (member == null) {
objin.skipValue(); // 跳过不存在的属性的值
in.skipValue(); // 跳过不存在的属性的值
} else {
Object val = readDeMemberValue(objin, member, first);
Object val = readDeMemberValue(in, member, first);
boolean flag = true;
for (int i = 0; i < constructorFields.length; i++) {
if (member == constructorFields[i]) {
@@ -418,8 +416,7 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
}
first = false;
}
objin.readObjectE(typeClass);
offerReader(in, objin);
in.readObjectE(typeClass);
if (this.creator == null) {
return null;
}
@@ -440,18 +437,6 @@ public class ObjectDecoder<R extends Reader, T> implements Decodeable<R, T> {
// do nothing
}
protected boolean hasNext(R in, boolean first) {
return in.hasNext();
}
protected R objectReader(R in) {
return in;
}
protected void offerReader(R parent, R out) {
// do nothing
}
protected Object readDeMemberValue(R in, DeMember member, boolean first) {
return member.read(in);
}

View File

@@ -7,9 +7,9 @@ package org.redkale.convert.bson;
import java.nio.charset.StandardCharsets;
import org.redkale.convert.*;
import static org.redkale.convert.Reader.SIGN_NULL;
import org.redkale.convert.ext.ByteSimpledCoder;
import org.redkale.util.*;
import static org.redkale.convert.Reader.SIGN_NULL;
/**
* BSON数据源
@@ -129,7 +129,6 @@ public class BsonReader extends Reader {
break;
default:
Decodeable decoder = BsonFactory.typeEnum(val);
System.out.println("val = " + val + ", decoder = " + decoder);
if (decoder != null) {
decoder.convertFrom(this);
}

View File

@@ -47,7 +47,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
max = decoder.getMembers().length;
}
for (DeMember member : decoder.getMembers()) {
String name = member.getAttribute().field();
String name = member.getFieldName();
this.repeatFieldToDecoders.put(name, decoder);
fields[i].add(name);
Attribute t = fieldTypes.get(name);
@@ -164,7 +164,7 @@ public class JsonMultiImplDecoder<T> implements Decodeable<JsonReader, T> {
for (int j = 0; j < params.length; j++) {
if (params[j] != null
&& params[j][0] != null
&& constructorFields[i].getAttribute().field().equals(((Attribute) params[j][0]).field())) {
&& constructorFields[i].getFieldName().equals(((Attribute) params[j][0]).field())) {
constructorParams[i] = params[j][1];
params[j] = null;
break;

View File

@@ -44,7 +44,7 @@ public class JsonReader extends Reader {
public JsonReader(char[] text, int start, int len) {
this.text = Objects.requireNonNull(text);
this.position = start - 1;
this.limit = start + len - 1;
this.limit = this.position + len;
}
public final JsonReader setText(String text) {
@@ -58,7 +58,7 @@ public class JsonReader extends Reader {
public final JsonReader setText(char[] text, int start, int len) {
this.text = text;
this.position = start - 1;
this.limit = start + len - 1;
this.limit = this.position + len;
return this;
}

View File

@@ -27,26 +27,25 @@ public class ProtobufArrayDecoder<T> extends ArrayDecoder<ProtobufReader, T> {
@Override
public T[] convertFrom(ProtobufReader in, DeMember member) {
this.checkInited();
final boolean simpled = this.componentSimpled;
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
in.readArrayB(member, itemDecoder);
int contentLength = in.readMemberContentLength(member, itemDecoder);
final List<T> result = new ArrayList();
boolean first = true;
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
ProtobufReader itemReader = getItemReader(in, member, first);
if (itemReader == null) { // 元素读取完毕
final int limit = in.limit();
while (in.hasNext()) {
ProtobufReader subin = in;
if (!simpled) {
int contentLen = in.readRawVarint32();
in.limit(in.position() + contentLen + 1);
}
result.add(itemDecoder.convertFrom(subin));
in.limit(limit);
if (!in.readNextTag(member)) { // 元素结束
break;
}
result.add(itemDecoder.convertFrom(itemReader));
first = false;
}
in.readArrayE();
T[] rs = this.componentArrayFunction.apply(result.size());
return result.toArray(rs);
}
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
}
}

View File

@@ -25,25 +25,23 @@ public class ProtobufCollectionDecoder<T> extends CollectionDecoder<ProtobufRead
@Override
public Collection<T> convertFrom(ProtobufReader in, DeMember member) {
this.checkInited();
final boolean simpled = !this.componentSimpled;
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
in.readArrayB(member, itemDecoder);
int contentLength = in.readMemberContentLength(member, itemDecoder);
final Collection<T> result = this.creator.create();
boolean first = true;
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
ProtobufReader itemReader = getItemReader(in, member, first);
if (itemReader == null) { // 元素读取完毕
final int limit = in.limit();
while (in.hasNext()) {
if (!simpled) {
int contentLen = in.readRawVarint32();
in.limit(in.position() + contentLen + 1);
}
result.add(itemDecoder.convertFrom(in));
in.limit(limit);
if (!in.readNextTag(member)) { // 元素结束
break;
}
result.add(itemDecoder.convertFrom(itemReader));
first = false;
}
in.readArrayE();
return result;
}
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
}
}

View File

@@ -240,7 +240,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
.append(ProtobufFactory.wireTypeString(
member.getDecoder().getType(), ((ProtobufFactory) factory).enumtostring))
.append(" ")
.append(member.getAttribute().field())
.append(member.getFieldName())
.append("\" : ")
.append(member.getPosition())
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
@@ -389,7 +389,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
.append(ProtobufFactory.wireTypeString(
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
.append(" ")
.append(member.getAttribute().field())
.append(member.getFieldName())
.append("\" : ")
.append(member.getPosition())
.append(i == members.size() - 1 ? "\r\n" : ",\r\n");
@@ -541,7 +541,7 @@ public class ProtobufConvert extends BinaryConvert<ProtobufReader, ProtobufWrite
.append(ProtobufFactory.wireTypeString(
member.getEncoder().getType(), ((ProtobufFactory) factory).enumtostring))
.append(" ")
.append(member.getAttribute().field())
.append(member.getFieldName())
.append(" = ")
.append(member.getPosition())
.append(member.getComment().isEmpty() ? ";\r\n" : ("; //" + member.getComment() + " \r\n"));

View File

@@ -8,8 +8,8 @@ import java.lang.reflect.*;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.atomic.*;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import org.redkale.asm.*;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import static org.redkale.asm.Opcodes.*;
import org.redkale.convert.*;
import org.redkale.util.*;
@@ -54,7 +54,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
final Map<String, EnMember> otherMembers = new HashMap<>();
StringBuilder elementb = new StringBuilder();
for (EnMember member : selfObjEncoder.getMembers()) {
final String fieldName = member.getAttribute().field();
final String fieldName = member.getFieldName();
final Class fieldClass = member.getAttribute().type();
final Type fieldType = member.getAttribute().genericType();
elementb.append(fieldName).append(',');
@@ -172,7 +172,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
mv.visitMethodInsn(INVOKEVIRTUAL, pbwriterName, "writeObjectB", "(Ljava/lang/Object;)V", false);
for (EnMember member : selfObjEncoder.getMembers()) {
final String fieldName = member.getAttribute().field();
final String fieldName = member.getFieldName();
final Type fieldType = member.getAttribute().genericType();
final Class fieldClass = member.getAttribute().type();
if (ProtobufFactory.isSimpleType(fieldClass)) {

View File

@@ -303,44 +303,6 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
return true;
}
protected static ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean simpled, boolean first) {
if (simpled) {
if (member == null || first) {
return in;
}
int tag = in.readTag();
if (tag != member.getTag()) { // 元素结束
in.backTag(tag);
return null;
}
return in;
} else {
if (!first && member != null) {
int tag = in.readTag();
if (tag != member.getTag()) { // 元素结束
in.backTag(tag);
return null;
}
}
byte[] bs = in.readByteArray();
return new ProtobufReader(bs);
}
}
protected static boolean isNoLenBytesType(Type type) {
return (type instanceof Class && ((Class) type).isPrimitive())
|| type == Boolean.class
|| type == Byte.class
|| type == Short.class
|| type == Character.class
|| type == Integer.class
|| type == Float.class
|| type == Long.class
|| type == Double.class
|| type == AtomicInteger.class
|| type == AtomicLong.class;
}
protected static boolean isSimpleType(Class fieldClass) {
return fieldClass.isPrimitive()
|| fieldClass == Boolean.class
@@ -476,23 +438,21 @@ public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWrit
public static int wireType(Type javaType, boolean enumtostring) {
if (javaType == double.class || javaType == Double.class) {
return 1;
}
if (javaType == float.class || javaType == Float.class) {
} else if (javaType == float.class || javaType == Float.class) {
return 5;
}
if (javaType == boolean.class || javaType == Boolean.class) {
} else if ((javaType == boolean.class || javaType == Boolean.class)
|| (javaType == byte.class || javaType == Byte.class)
|| (javaType == char.class || javaType == Character.class)
|| (javaType == short.class || javaType == Short.class)
|| (javaType == int.class || javaType == Integer.class)
|| (javaType == long.class || javaType == Long.class)
|| (javaType == AtomicInteger.class || javaType == AtomicLong.class)) {
return 0;
} else if (!enumtostring && (javaType instanceof Class) && ((Class) javaType).isEnum()) {
return 0;
} else { // byte[]
return 2;
}
if (javaType instanceof Class) {
Class javaClazz = (Class) javaType;
if (javaClazz.isEnum()) {
return enumtostring ? 2 : 0;
}
if (javaClazz.isPrimitive() || Number.class.isAssignableFrom(javaClazz)) {
return 0;
}
}
return 2;
}
public static String wireTypeString(Type javaType, boolean enumtostring) {

View File

@@ -28,34 +28,23 @@ public class ProtobufMapDecoder<K, V> extends MapDecoder<ProtobufReader, K, V> {
this.checkInited();
in.readMapB(member, this.keyDecoder, this.valueDecoder);
final Map<K, V> result = this.creator.create();
boolean first = true;
Decodeable<ProtobufReader, K> kdecoder = this.keyDecoder;
Decodeable<ProtobufReader, V> vdecoder = this.valueDecoder;
final int limit = in.limit();
while (in.hasNext()) {
ProtobufReader entryReader = getEntryReader(in, member, first);
if (entryReader == null) {
int contentLen = in.readRawVarint32();
in.limit(in.position() + contentLen + 1);
in.readTag();
K key = kdecoder.convertFrom(in);
in.readTag();
V value = vdecoder.convertFrom(in);
result.put(key, value);
in.limit(limit);
if (!in.readNextTag(member)) { // 元素结束
break;
}
entryReader.readTag();
K key = kdecoder.convertFrom(entryReader);
entryReader.readTag();
V value = vdecoder.convertFrom(entryReader);
result.put(key, value);
first = false;
}
in.readMapE();
return result;
}
protected ProtobufReader getEntryReader(ProtobufReader in, DeMember member, boolean first) {
if (!first && member != null) {
int tag = in.readTag();
if (tag != member.getTag()) {
in.backTag(tag);
return null;
}
}
byte[] bs = in.readByteArray();
return new ProtobufReader(bs);
}
}

View File

@@ -13,12 +13,27 @@ import org.redkale.util.*;
* @author zhangjx
* @param <T> T
*/
public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T>
implements TagDecodeable<ProtobufReader, T> {
protected ProtobufObjectDecoder(Type type) {
super(type);
}
@Override
public T convertFrom(ProtobufReader in, DeMember member) {
if (member == null) {
return super.convertFrom(in);
} else {
final int limit = in.limit();
int contentLen = in.readRawVarint32();
in.limit(in.position() + contentLen + 1);
T result = super.convertFrom(in);
in.limit(limit);
return result;
}
}
@Override
protected void initForEachDeMember(ConvertFactory factory, DeMember member) {
if (member.getIndex() < 1) {
@@ -30,19 +45,6 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
setTag(member, ProtobufFactory.getTag(attr.field(), attr.genericType(), member.getPosition(), enumtostring));
}
@Override
protected ProtobufReader objectReader(ProtobufReader in) {
if (in.position() > in.initoffset) {
return new ProtobufReader(in.readByteArray());
}
return in;
}
@Override
protected boolean hasNext(ProtobufReader in, boolean first) {
return in.hasNext();
}
@Override
protected Object readDeMemberValue(ProtobufReader in, DeMember member, boolean first) {
Decodeable decoder = member.getDecoder();
@@ -62,4 +64,5 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T> {
member.read(in, result);
}
}
}

View File

@@ -16,9 +16,11 @@ public class ProtobufReader extends Reader {
protected int position = -1;
protected int initoffset;
protected byte[] content;
private byte[] content;
//protected int initoffset;
protected int limit;
protected int cacheTag = Integer.MIN_VALUE;
@@ -49,7 +51,8 @@ public class ProtobufReader extends Reader {
public final void setBytes(byte[] bytes) {
if (bytes == null) {
this.position = 0;
this.initoffset = 0;
//this.initoffset = 0;
this.limit = 0;
} else {
setBytes(bytes, 0, bytes.length);
}
@@ -58,17 +61,28 @@ public class ProtobufReader extends Reader {
public final void setBytes(byte[] bytes, int start, int len) {
if (bytes == null) {
this.position = 0;
this.initoffset = 0;
//this.initoffset = 0;
this.limit = 0;
} else {
this.content = bytes;
this.position = start - 1;
this.initoffset = this.position;
this.limit = start + len;
//this.initoffset = this.position;
}
}
public void limit(int limit) {
this.limit = limit;
}
public int limit() {
return this.limit;
}
protected boolean recycle() {
this.position = -1;
this.initoffset = -1;
this.limit = -1;
//this.initoffset = -1;
this.content = null;
return true;
}
@@ -78,11 +92,12 @@ public class ProtobufReader extends Reader {
return this;
}
// 通常用于尾部解析
public byte[] remainBytes() {
if (this.position >= this.content.length) {
if (this.position >= this.limit) {
return new byte[0];
}
return Arrays.copyOfRange(this.content, this.position + 1, this.content.length);
return Arrays.copyOfRange(this.content, this.position + 1, this.limit);
}
/** 跳过属性的值 */
@@ -113,7 +128,7 @@ public class ProtobufReader extends Reader {
@Override
public final String readObjectB(final Class clazz) {
return (this.position + 1) < this.content.length ? "" : null;
return (this.position + 1) < this.limit ? "" : null;
}
@Override
@@ -159,13 +174,6 @@ public class ProtobufReader extends Reader {
return this.position;
}
public final int readMemberContentLength(DeMember member, Decodeable decoder) {
if (member == null && decoder == null) {
return -1; // 为byte[]
}
return member != null ? -1 : readRawVarint32(); // readUInt32
}
@Override
public final DeMember readFieldName(final DeMemberInfo memberInfo) {
int tag = readTag();
@@ -452,6 +460,18 @@ public class ProtobufReader extends Reader {
return val;
}
public boolean readNextTag(DeMember member) {
if (!hasNext()) {
return false;
}
int tag = readTag();
if (tag != member.getTag()) { // 元素结束
backTag(tag);
return false;
}
return true;
}
protected final int readTag() {
if (cacheTag != Integer.MIN_VALUE) {
int tag = cacheTag;
@@ -471,22 +491,7 @@ public class ProtobufReader extends Reader {
@Override
public boolean hasNext() {
return (this.position + 1) < this.content.length;
}
/**
* 判断对象是否存在下一个属性或者数组是否存在下一个元素
*
* @param startPosition 起始位置
* @param contentLength 内容大小, 不确定的传-1
* @return 是否存在
*/
public boolean hasNext(int startPosition, int contentLength) {
// ("-------------: " + startPosition + ", " + contentLength + ", " + this.position);
if (startPosition >= 0 && contentLength >= 0) {
return (this.position) < (startPosition + contentLength);
}
return (this.position + 1) < this.content.length;
return (this.position + 1) < this.limit;
}
@Override
@@ -503,7 +508,7 @@ public class ProtobufReader extends Reader {
fastpath:
{
int curr = this.position;
if ((curr + 1) == data.length) {
if ((curr + 1) == limit) {
break fastpath;
}
@@ -511,7 +516,7 @@ public class ProtobufReader extends Reader {
if ((x = data[++curr]) >= 0) {
this.position = curr;
return x;
} else if (data.length - (curr + 1) < 9) {
} else if (limit - (curr + 1) < 9) {
break fastpath;
} else if ((x ^= (data[++curr] << 7)) < 0) {
x ^= (~0 << 7);
@@ -543,7 +548,7 @@ public class ProtobufReader extends Reader {
fastpath:
{
int curr = this.position;
if ((curr + 1) == data.length) {
if ((curr + 1) == this.limit) {
break fastpath;
}
@@ -552,7 +557,7 @@ public class ProtobufReader extends Reader {
if ((y = data[++curr]) >= 0) {
this.position = curr;
return y;
} else if (data.length - (curr + 1) < 9) {
} else if (this.limit - (curr + 1) < 9) {
break fastpath;
} else if ((y ^= (data[++curr] << 7)) < 0) {
x = y ^ (~0 << 7);

View File

@@ -26,25 +26,23 @@ public class ProtobufStreamDecoder<T> extends StreamDecoder<ProtobufReader, T> {
@Override
public Stream<T> convertFrom(ProtobufReader in, DeMember member) {
this.checkInited();
final boolean simpled = !this.componentSimpled;
final Decodeable<ProtobufReader, T> itemDecoder = this.componentDecoder;
in.readArrayB(member, itemDecoder);
int contentLength = in.readMemberContentLength(member, itemDecoder);
final List<T> result = new ArrayList();
boolean first = true;
int startPosition = in.position();
while (in.hasNext(startPosition, contentLength)) {
ProtobufReader itemReader = getItemReader(in, member, first);
if (itemReader == null) { // 元素读取完毕
final int limit = in.limit();
while (in.hasNext()) {
if (!simpled) {
int contentLen = in.readRawVarint32();
in.limit(in.position() + contentLen + 1);
}
result.add(itemDecoder.convertFrom(in));
in.limit(limit);
if (!in.readNextTag(member)) { // 元素结束
break;
}
result.add(itemDecoder.convertFrom(itemReader));
first = false;
}
in.readArrayE();
return result.stream();
}
protected ProtobufReader getItemReader(ProtobufReader in, DeMember member, boolean first) {
return ProtobufFactory.getItemReader(in, member, componentSimpled, first);
}
}

View File

@@ -3562,6 +3562,18 @@ public final class Utility {
* @param bytes 字节数组
*/
public static void println(String string, byte... bytes) {
println(string, bytes, 0, bytes.length);
}
/**
* 将字节数组的内容转换成字符串并打印到控制台, string参数不为空时会追加在字节数组内容字符串之前
*
* @param string 字符串前缀
* @param bytes 字节数组
* @param start 起始位置
* @param len 长度
*/
public static void println(String string, byte[] bytes, int start, int len) {
if (bytes == null) {
return;
}
@@ -3569,9 +3581,10 @@ public final class Utility {
if (string != null) {
sb.append(string);
}
sb.append(bytes.length).append(".[");
sb.append(len).append(".[");
boolean last = false;
for (byte b : bytes) {
for (int i = 0; i < len; i++) {
byte b = bytes[start + i];
if (last) {
sb.append(',');
}