feat[protocol]: 协议类可以不用再重写protocolId()方法也能够自动获取到协议号

This commit is contained in:
jaysunxiao
2022-06-22 18:34:05 +08:00
parent dbc0011970
commit 45022be3ce
6 changed files with 24 additions and 23 deletions
@@ -16,7 +16,6 @@ import com.zfoo.protocol.IPacket;
import com.zfoo.protocol.ProtocolManager;
import com.zfoo.protocol.exception.RunException;
import com.zfoo.protocol.registration.IProtocolRegistration;
import com.zfoo.protocol.registration.ProtocolAnalysis;
import com.zfoo.protocol.util.FileUtils;
import com.zfoo.protocol.util.IOUtils;
import com.zfoo.protocol.util.StringUtils;
@@ -40,11 +39,11 @@ import java.util.function.BiConsumer;
*/
public class FileChannelMap<V extends IPacket> implements LpMap<V>, Closeable {
private File dbFile;
private final File dbFile;
protected RandomAccessFile dbFileRandomAccess;
protected FileChannel dbFileChannel;
private File indexFile;
private final File indexFile;
protected RandomAccessFile indexFileRandomAccess;
protected FileChannel indexFileChannel;
@@ -65,7 +64,7 @@ public class FileChannelMap<V extends IPacket> implements LpMap<V>, Closeable {
this.indexFileRandomAccess = new RandomAccessFile(indexFile, "rw");
this.indexFileChannel = this.indexFileRandomAccess.getChannel();
var protocolId = ProtocolAnalysis.getProtocolIdByClass(clazz);
var protocolId = ProtocolManager.getProtocolIdByClass(clazz);
protocolRegistration = ProtocolManager.getProtocol(protocolId);
indexBuffer = ByteBufAllocator.DEFAULT.ioBuffer(16);
@@ -16,7 +16,6 @@ import com.zfoo.protocol.IPacket;
import com.zfoo.protocol.ProtocolManager;
import com.zfoo.protocol.buffer.ByteBufUtils;
import com.zfoo.protocol.registration.IProtocolRegistration;
import com.zfoo.protocol.registration.ProtocolAnalysis;
import com.zfoo.protocol.util.FileUtils;
import com.zfoo.protocol.util.IOUtils;
import com.zfoo.protocol.util.StringUtils;
@@ -37,17 +36,17 @@ import java.util.function.BiConsumer;
*/
public class FileHeapMap<V extends IPacket> implements LpMap<V> {
private File dbFile;
private final File dbFile;
private IProtocolRegistration protocolRegistration;
private final IProtocolRegistration protocolRegistration;
private HeapMap<V> heapMap;
private final HeapMap<V> heapMap;
public FileHeapMap(String dbPath, Class<V> clazz) {
try {
this.dbFile = FileUtils.getOrCreateFile(dbPath, StringUtils.format("{}.db", clazz.getSimpleName()));
var protocolId = ProtocolAnalysis.getProtocolIdByClass(clazz);
var protocolId = ProtocolManager.getProtocolIdByClass(clazz);
protocolRegistration = ProtocolManager.getProtocol(protocolId);
heapMap = new HeapMap<>();
@@ -23,9 +23,15 @@ public interface IPacket {
/**
* 这个类的协议号
* <p>
* 子类可以不用重写这个方法,也能够通过反射自动获取到PROTOCOL_ID这个协议号,序列化一次对象只会调用一次,性能损失很小
* <p>
* 重写这个方法,使用多态获取协议号,可以提高一点性能
*
* @return 协议号Id
*/
short protocolId();
default short protocolId() {
return ProtocolManager.getProtocolIdByClass(this.getClass());
}
}
@@ -18,12 +18,11 @@ import com.zfoo.protocol.registration.IProtocolRegistration;
import com.zfoo.protocol.registration.ProtocolAnalysis;
import com.zfoo.protocol.registration.ProtocolModule;
import com.zfoo.protocol.util.AssertionUtils;
import com.zfoo.protocol.util.ReflectionUtils;
import com.zfoo.protocol.xml.XmlProtocols;
import io.netty.buffer.ByteBuf;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;
import java.util.Set;
@@ -87,16 +86,21 @@ public class ProtocolManager {
return moduleOptional.get();
}
public static short getProtocolIdByClass(Class<?> clazz) {
var protocolIdField = ReflectionUtils.getFieldByNameInPOJOClass(clazz, PROTOCOL_ID);
return (short) ReflectionUtils.getField(protocolIdField, null);
}
public static void initProtocol(Set<Class<?>> protocolClassSet) {
ProtocolAnalysis.analyze(protocolClassSet, GenerateOperation.NO_OPERATION);
}
public static void initProtocol(Set<Class<?>> protocolClassSet, GenerateOperation generateOperation) {
ProtocolAnalysis.analyze(protocolClassSet, generateOperation);
ProtocolAnalysis.analyze(protocolClassSet, generateOperation);
}
public static void initProtocol(XmlProtocols xmlProtocols, GenerateOperation generateOperation) {
ProtocolAnalysis.analyze(xmlProtocols, generateOperation);
ProtocolAnalysis.analyze(xmlProtocols, generateOperation);
}
}
@@ -402,12 +402,6 @@ public class ProtocolAnalysis {
throw new RunException("[type:{}]类型不正确", type);
}
public static short getProtocolIdByClass(Class<?> clazz) {
var protocolIdField = ReflectionUtils.getFieldByNameInPOJOClass(clazz, PROTOCOL_ID);
ReflectionUtils.makeAccessible(protocolIdField);
return (short) ReflectionUtils.getField(protocolIdField, null);
}
/**
* 此方法仅在生成协议的时候调用,一旦运行,不能调用
@@ -21,7 +21,6 @@ import com.zfoo.protocol.generate.GenerateOperation;
import com.zfoo.protocol.generate.GenerateProtocolDocument;
import com.zfoo.protocol.model.Pair;
import com.zfoo.protocol.registration.IProtocolRegistration;
import com.zfoo.protocol.registration.ProtocolAnalysis;
import com.zfoo.protocol.registration.ProtocolRegistration;
import com.zfoo.protocol.registration.field.*;
import com.zfoo.protocol.serializer.reflect.*;
@@ -122,7 +121,7 @@ public abstract class GenerateProtobufUtils {
for (var protos : xmlProtobuf.getProtos()) {
for (var protocol : protos.getProtocols()) {
var protocolClass = Class.forName(protocol.getLocation());
var protocolId = ProtocolAnalysis.getProtocolIdByClass(protocolClass);
var protocolId = ProtocolManager.getProtocolIdByClass(protocolClass);
var protocolRegistration = ProtocolManager.getProtocol(protocolId);
if (allGenerateProtocols.contains(protocolRegistration)) {
@@ -189,7 +188,7 @@ public abstract class GenerateProtobufUtils {
for (var protocol : protos.getProtocols()) {
var protocolClass = Class.forName(protocol.getLocation());
var protocolId = ProtocolAnalysis.getProtocolIdByClass(protocolClass);
var protocolId = ProtocolManager.getProtocolIdByClass(protocolClass);
var protocolRegistration = ProtocolManager.getProtocol(protocolId);
var protocolDocument = GenerateProtocolDocument.getProtocolDocument(protocolId);