From 55d7139f93951bea340c921709375d8c7087a757 Mon Sep 17 00:00:00 2001 From: meiwei <309921330@qq.com> Date: Fri, 22 Jul 2022 18:12:22 +0800 Subject: [PATCH] =?UTF-8?q?perf[protocol]:=20=E4=BC=98=E5=8C=96=E4=BA=86cl?= =?UTF-8?q?azz=E5=92=8Cprotocol=E7=9A=84=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zfoo/protocol/ProtocolManager.java | 12 +++--------- .../protocol/registration/ProtocolAnalysis.java | 13 ++++++++++++- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java index 80939e6e..2215f4c4 100644 --- a/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java +++ b/protocol/src/main/java/com/zfoo/protocol/ProtocolManager.java @@ -30,6 +30,7 @@ import java.util.*; public class ProtocolManager { public static final String PROTOCOL_ID = "PROTOCOL_ID"; + public static final String PROTOCOL_METHOD = "protocolId"; public static final short MAX_PROTOCOL_NUM = Short.MAX_VALUE; public static final byte MAX_MODULE_NUM = Byte.MAX_VALUE; @@ -46,7 +47,7 @@ public class ProtocolManager { * key:协议class * value:protocolId */ - private static final Map, Short> protocolIdMap = new HashMap<>(); + public static final Map, Short> protocolIdMap = new HashMap<>(); static { // 初始化默认协议模块 @@ -109,16 +110,9 @@ public class ProtocolManager { public static short protocolId(Class clazz) { var protocolId = protocolIdMap.get(clazz); - if (protocolId == null) { - protocolId = ProtocolAnalysis.getProtocolIdByClass(clazz); - // 使用懒加载的方式,主要是想节省一点空间,实际运行只有IPacket没有重写protocolId的Response和Answer才会放进去 - synchronized (protocolIdMap) { - protocolIdMap.put(clazz, protocolId); - } - } return protocolId; } - + public static void initProtocol(Set> protocolClassSet) { ProtocolAnalysis.analyze(protocolClassSet, GenerateOperation.NO_OPERATION); } diff --git a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java index d4925f62..f8b4a570 100644 --- a/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java +++ b/protocol/src/main/java/com/zfoo/protocol/registration/ProtocolAnalysis.java @@ -489,12 +489,23 @@ public class ProtocolAnalysis { IPacket packet = (IPacket) constructor.newInstance(); var protocolId = (short) protocolIdField.get(null); // 验证protocol()方法的返回是否和PROTOCOL_ID相等 - AssertionUtils.isTrue(packet.protocolId() == protocolId, "[class:{}]的protocolId返回的值和协议号的静态变量[{}]不相等", clazz.getCanonicalName(), PROTOCOL_ID); + Method protocolMethod; + try { + protocolMethod = clazz.getDeclaredMethod(PROTOCOL_METHOD); + } catch (NoSuchMethodException e) { + protocolMethod = null; + } + if (protocolMethod != null) { + var methodReturnId = (short) protocolMethod.invoke(packet); + AssertionUtils.isTrue(methodReturnId == protocolId, "[class:{}]的protocolId返回的值和协议号的静态变量[{}]不相等", clazz.getCanonicalName(), PROTOCOL_ID); + } var previous = protocolClassMap.put(protocolId, clazz); if (previous != null) { throw new RunException("[{}][{}]协议号[protocolId:{}]重复", clazz.getCanonicalName(), previous.getCanonicalName(), protocolId); } + //存储class和protocolId的映射 + protocolIdMap.put(clazz, protocolId); } private static void checkSubProtocol(Class clazz, short id, Class subClass) {