mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-05-22 20:27:11 +00:00
feat[protocol]: 协议类可以不用再重写protocolId()方法也能够自动获取到协议号
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 此方法仅在生成协议的时候调用,一旦运行,不能调用
|
||||
|
||||
+2
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user