最近在做一个需要热更新的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 ,自然就可以转换了.
搞定.这样就是热更新的时候只能在接口的定义范围内修改了.如果需要修改接口.那就只能等服务器重启了.