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) {