From 67045aad383f0029bf354e6a7e25159a720a81cb Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Thu, 3 Jun 2021 11:53:16 +0800 Subject: [PATCH] =?UTF-8?q?perf[protocol]:=20=E5=B0=86=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E7=9A=84=E5=8D=8F=E8=AE=AE=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zfoo/protocol/ProtocolManager.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java index 28f30f99..1ea0ea8e 100644 --- a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java +++ b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java @@ -70,9 +70,11 @@ public class ProtocolManager { // 临时变量,启动完成就会销毁,是一个基本类型序列化器 private static Map, ISerializer> tempBaseSerializerMap = new HashMap<>(); - // 临时变量,启动完成就会销毁,协议下包含的子协议,只包含一层子协议 - private static Map> tempSubProtocolIdMap = new HashMap<>(); + // 临时变量,启动完成就会销毁,协议Id对应的Class类 + private static Map> tempProtocolClassMap = new HashMap<>(MAX_PROTOCOL_NUM); + // 临时变量,启动完成就会销毁,协议下包含的子协议,只包含一层子协议 + private static Map> tempSubProtocolIdMap = new HashMap<>(MAX_PROTOCOL_NUM); static { // 初始化默认协议模块 @@ -197,6 +199,15 @@ public class ProtocolManager { // 协议号是否和id是否相等 AssertionUtils.isTrue(packet.protocolId() == id, "[class:{}]协议序列号[{}]和协议文件里的协议序列号不相等", clazz.getCanonicalName(), PROTOCOL_ID); + tempProtocolClassMap.put(id, clazz); + } + } + + for (var moduleDefinition : xmlProtocols.getModules()) { + var module = modules[moduleDefinition.getId()]; + for (var protocolDefinition : moduleDefinition.getProtocols()) { + var id = protocolDefinition.getId(); + var clazz = tempProtocolClassMap.get(id); try { var registration = parseProtocolRegistration(clazz, module); if (protocolDefinition.isEnhance()) { @@ -370,6 +381,13 @@ public class ProtocolManager { } } + private static void checkSubProtocol(Class clazz, short id, Class subClass) { + var registerProtocolClass = tempProtocolClassMap.get(id); + if (registerProtocolClass == null || !registerProtocolClass.equals(subClass)) { + throw new RunException("协议[{}]的子协议[{}][{}]没有注册", clazz.getCanonicalName(), id, subClass.getCanonicalName()); + } + } + private static ProtocolRegistration parseProtocolRegistration(Class clazz, ProtocolModule module) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException, InstantiationException { var protocolId = checkProtocol(clazz); @@ -469,7 +487,7 @@ public class ProtocolManager { } IFieldRegistration registration = typeToRegistration(clazz, types[0]); - return ListField.valueOf(registration, (ParameterizedType) type); + return ListField.valueOf(registration, type); } else if (Map.class.isAssignableFrom(fieldTypeClazz)) { if (!fieldTypeClazz.equals(Map.class)) { @@ -495,6 +513,7 @@ public class ProtocolManager { } else { // 是一个协议引用变量 var referenceProtocolId = getProtocolIdByClass(field.getType()); + checkSubProtocol(clazz, referenceProtocolId, field.getType()); tempSubProtocolIdMap.computeIfAbsent(getProtocolIdByClass(clazz), it -> new HashSet<>()).add(referenceProtocolId); return ObjectProtocolField.valueOf(referenceProtocolId); } @@ -532,6 +551,7 @@ public class ProtocolManager { } else { // 是一个协议引用变量 var referenceProtocolId = getProtocolIdByClass(clazz); + checkSubProtocol(clazz, referenceProtocolId, clazz); tempSubProtocolIdMap.computeIfAbsent(getProtocolIdByClass(currentProtocolClass), it -> new HashSet<>()).add(referenceProtocolId); return ObjectProtocolField.valueOf(referenceProtocolId); }