package org.yzh.protocol.commons; import io.github.yezhihao.protostar.annotation.Message; import io.github.yezhihao.protostar.util.ClassUtils; import org.yzh.protocol.basics.JTMessage; import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author yezhihao * https://gitee.com/yezhihao/jt808-server */ public class MessageId { private static final Map messageId = new HashMap<>(256); private static final Map messageClass = new HashMap<>(256); static { for (Class clazz : new Class[]{JT808.class, JT1078.class, JSATL12.class}) { Field[] fields = clazz.getFields(); for (Field field : fields) { try { if (!Integer.TYPE.isAssignableFrom(field.getType())) continue; int id = field.getInt(null); String hexId = leftPad(Integer.toHexString(id), 4, '0'); String name = field.getName(); messageId.put(id, "[" + hexId + "]" + name); } catch (Exception e) { e.printStackTrace(); } } } List classList = ClassUtils.getClassList("org.yzh.protocol"); for (Class clazz : classList) { Message annotation = clazz.getAnnotation(Message.class); if (annotation != null) { int[] value = annotation.value(); for (int i : value) { messageClass.put(i, clazz); } } } } public static Class getClass(Integer id) { return messageClass.get(id); } public static String getName(int id) { String name = messageId.get(id); if (name != null) { return name; } return leftPad(Integer.toHexString(id), 4, '0'); } public static String leftPad(String str, int size, char ch) { int length = str.length(); int pads = size - length; if (pads > 0) { char[] result = new char[size]; str.getChars(0, length, result, pads); while (pads > 0) result[--pads] = ch; return new String(result); } return str; } }