热更新之后出现的问题

最近在做一个需要热更新的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 ,自然就可以转换了.

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


猜你喜欢

转载自blog.csdn.net/xinrui5577/article/details/31759119