- 33
- 0
在一个Java类内定义了一个接口,然后将接口作为本类的一个方法的参数,当调用这个方法时,本应传入接口的位置传入了本类的另一个方法(这个方法和接口中的唯一方法的参数类型对应)。程序如下所示。我很不清楚这样使用的原理,接口和方法完全是两个东西,在调用的过程中发生了什么转换实现了这种方式?希望哪位大神指点一下,感谢。
包含接口的类(其中定义了函数式接口、和参数为接口的方法、以及调用时传入的方法):
public class ClientMessage {
private static final Logger logger = LoggerFactory.getLogger(ClientMessage.class);
public static HashMap<Integer, Transfer> tranferHandlerMap = new HashMap<>();
public static HashMap<Class<?>, Integer> msg2ptoNum = new HashMap<>();
@FunctionalInterface
public interface Transfer{
void process(Message msg, ClientConnection conn) throws IOException;
}
public static void registerTransferHandler(Integer ptoNum, Transfer tranfer, Class<?> cla) {
if (tranferHandlerMap.get(ptoNum) == null)
tranferHandlerMap.put(ptoNum, tranfer);
else {
logger.error("pto has been registered in transeerHandlerMap, ptoNum: {}", ptoNum);
return;
}
if(msg2ptoNum.get(cla) == null)
msg2ptoNum.put(cla, ptoNum);
else {
logger.error("pto has been registered in msg2ptoNum, ptoNum: {}", ptoNum);
return;
}
}
public static void processTransferHandler(Message msg, ClientConnection conn) throws IOException {
logger.info("MessageName {}", msg.getClass());
int ptoNum = msg2ptoNum.get(msg.getClass());
Transfer transferHandler = tranferHandlerMap.get(ptoNum);
if(transferHandler != null) {
transferHandler.process(msg, conn);
}
}
public static void transfer2Logic(Message msg, ClientConnection conn) {
ByteBuf byteBuf = null;
if(conn.getUserId() == null ) {
logger.error("User not login.");
return;
}
if(msg instanceof Chat.CPrivateChat) {
byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Logic, conn.getUserId());
}
GateLogicConnectionHandler.getGatelogicConnection().writeAndFlush(byteBuf);
}
public static void transfer2Auth(Message msg, ClientConnection conn) {
ByteBuf byteBuf = null;
if(msg instanceof Auth.CLogin) {
String userId = ((Auth.CLogin) msg).getUserid();
byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, userId);
ClientConnectionMap.registerUserid(userId, conn.getNetId());
} else if(msg instanceof Auth.CRegister) {
byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, ((Auth.CRegister) msg).getUserid());
}
GateAuthConnectionHandler.getGateAuthConnection().writeAndFlush(byteBuf);
}
}
调用方法时的代码:
ClientMessage.registerTransferHandler(1000, ClientMessage::transfer2Auth, Auth.CLogin.class);
ClientMessage.registerTransferHandler(1001, ClientMessage::transfer2Auth, Auth.CRegister.class);
ClientMessage.registerTransferHandler(1003, ClientMessage::transfer2Logic, Chat.CPrivateChat.class);
ClientMessage.processTransferHandler(message, conn); 1
打赏
收藏
点击回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
