热更新之后出现的问题

最近在做一个需要热更新的java.服务器端程序.

摸索的过程中出现了不少问题.服务器端结构如下

不动态的lib|

全局变量,

公用接口,

父类,

以及其他第三方lib

动态项目:

启动程序

子游戏的公用代码

子游戏A

子游戏B

子游戏CDEFGHIJK


在热更新的时候出现了第一个问题:

类型转换的时候一个异常:

object is not an instance of declaring class

一个Class不能转换成为同样样的Class.

a.b.c.ClassA.class 不能转化为 a.b.c.ClassA.class.这是同一个类. 为啥自己不能转换成自己呢?

因为ClassLoader不是同一个.当然不能转换.

在热更新的时候,正在内存中的Class不能销毁,玩家正在游戏中呢.怎么可以销毁呢.对吧.

但是热更新之后.新来的Class跟内存中的Class是存在不同宇宙空间的两个相同的人.虽然什么都一样.但是不能相互转换.

换成程序的语言就是 loader11111111.a.b.c.ClassA.class 不能转化为 loader2222222.a.b.c.ClassA.class

解决的办法就是抽象,接口.

在不变的lib中放着ClassA的接口.这样.都用接口做类型转换就不会出问题了.


loader11111111.a.b.c.ClassA.class,loader2222222.a.b.c.ClassA.class 都实现接口 loader0.a.b.c.IClassInterface ,自然就可以转换了.

搞定.这样就是热更新的时候只能在接口的定义范围内修改了.如果需要修改接口.那就只能等服务器重启了.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值