diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java b/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java index cfcc7115..b7839573 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/EnhanceUtils.java @@ -213,8 +213,8 @@ public abstract class EnhanceUtils { var packetClazz = constructor.getDeclaringClass(); if (packetClazz.isRecord()) { var fields = registration.getFields(); - var fieldNames = ProtocolAnalysis.getFields(packetClazz).stream().map(Field::getName).toList(); - List constructorParam = fieldNames.stream().collect(Collectors.toList()); + var originFields = ProtocolAnalysis.getFields(packetClazz); + var constructorParams = new String[originFields.size()]; for (var i = 0; i < fields.length; i++) { var field = fields[i]; @@ -225,11 +225,10 @@ public abstract class EnhanceUtils { } var readObject = enhanceSerializer(fieldRegistration.serializer()).readObject(builder, field, fieldRegistration); - int index = fieldNames.indexOf(field.getName()); - constructorParam.set(index, readObject); + int index = originFields.indexOf(field); + constructorParams[index] = readObject; } - - builder.append(packetClazz.getName() + " packet=new " + packetClazz.getName() + "(" + constructorParam.stream().collect(Collectors.joining(StringUtils.COMMA)) + ");"); + builder.append(packetClazz.getName() + " packet=new " + packetClazz.getName() + "(" + String.join(StringUtils.COMMA, constructorParams) + ");"); } else { var fields = registration.getFields(); builder.append(packetClazz.getName() + " packet=new " + packetClazz.getName() + "();"); diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java index 43d89d33..78c54831 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolRegistration.java @@ -126,21 +126,43 @@ public class ProtocolRegistration implements IProtocolRegistration { if (length == 0) { return null; } - Object object = ReflectionUtils.newInstance(constructor); + Object object = null; var readIndex = byteBuf.readerIndex(); - for (int i = 0, j = fields.length; i < j; i++) { - Field field = fields[i]; - // 协议向后兼容 - if (field.isAnnotationPresent(Compatible.class)) { - if (length == -1 || byteBuf.readerIndex() - readIndex >= length) { - break; + var packetClazz = constructor.getDeclaringClass(); + if (packetClazz.isRecord()) { + var originFields = ProtocolAnalysis.getFields(packetClazz); + var constructorParams = new Object[originFields.size()]; + for (int i = 0, j = fields.length; i < j; i++) { + Field field = fields[i]; + // 协议向后兼容 + if (field.isAnnotationPresent(Compatible.class)) { + if (length == -1 || byteBuf.readerIndex() - readIndex >= length) { + break; + } } + IFieldRegistration packetFieldRegistration = fieldRegistrations[i]; + ISerializer serializer = packetFieldRegistration.serializer(); + Object fieldValue = serializer.readObject(byteBuf, packetFieldRegistration); + var index = originFields.indexOf(field); + constructorParams[index] = fieldValue; + } + object = ReflectionUtils.newInstance(constructor, constructorParams); + } else { + object = ReflectionUtils.newInstance(constructor); + for (int i = 0, j = fields.length; i < j; i++) { + Field field = fields[i]; + // 协议向后兼容 + if (field.isAnnotationPresent(Compatible.class)) { + if (length == -1 || byteBuf.readerIndex() - readIndex >= length) { + break; + } + } + IFieldRegistration packetFieldRegistration = fieldRegistrations[i]; + ISerializer serializer = packetFieldRegistration.serializer(); + Object fieldValue = serializer.readObject(byteBuf, packetFieldRegistration); + ReflectionUtils.setField(field, object, fieldValue); } - IFieldRegistration packetFieldRegistration = fieldRegistrations[i]; - ISerializer serializer = packetFieldRegistration.serializer(); - Object fieldValue = serializer.readObject(byteBuf, packetFieldRegistration); - ReflectionUtils.setField(field, object, fieldValue); } if (length > 0) { diff --git a/protocol/src/main/java/com/zfoo/protocol/util/ReflectionUtils.java b/protocol/src/main/java/com/zfoo/protocol/util/ReflectionUtils.java index 96758069..3d4fdea8 100644 --- a/protocol/src/main/java/com/zfoo/protocol/util/ReflectionUtils.java +++ b/protocol/src/main/java/com/zfoo/protocol/util/ReflectionUtils.java @@ -198,7 +198,7 @@ public abstract class ReflectionUtils { try { return newInstance(clazz.getDeclaredConstructor()); } catch (NoSuchMethodException e) { - throw new RunException("[{}]无法被实例化", clazz); + throw new RunException("[{}] cannot be instantiated", clazz); } } @@ -206,7 +206,15 @@ public abstract class ReflectionUtils { try { return constructor.newInstance(); } catch (Exception e) { - throw new RunException("[{}]无法被实例化", constructor); + throw new RunException("[{}] cannot be instantiated", constructor); + } + } + + public static T newInstance(Constructor constructor, Object ... initargs) { + try { + return constructor.newInstance(initargs); + } catch (Exception e) { + throw new RunException("[{}] cannot be instantiated", constructor); } } @@ -336,12 +344,5 @@ public abstract class ReflectionUtils { } } - public static T newInstance(Constructor constructor, Object[] params) { - try { - return constructor.newInstance(params); - } catch (Exception e) { - throw new RunException("[{}]无法被实例化", constructor); - } - } }