好吧,我原本以为可以直接 as 实现,但现实告诉我想多了,所以这块我们需要额外的处理,基本的逻辑步骤是:
- 引用 Androidapi.JNI.JavaTypes 单元,以便我们引用 TJLang_Class。
- 使用 TJlang_Class.JavaClass.forName 获取子类的 Java 原生类型信息。
- 使用第二步返回的 JavaClass 的 cast 函数转换为新类型。
- 如果第三步成功,则调用目标类型的 Wrap 接口封装。
大概的一个Demo
function ToPayResp(AResp: JBaseResp):JPayResp; var APayResp: JPayResp; AJavaClass: Jlang_Class; begin AJavaClass := TJlang_Class.JavaClass.forName(AResp.getClass.getCanonicalName); if Assigned(AJavaClass) then Result:= TJPayResp.Wrap((AJavaClass.cast(AResp) as ILocalObject) .GetObjectID) else Result:=nil; end
实际上,通过 RTTI 应该和模板,应该可以写出一个相对通用的东西,但这个事情,暂时没时间研究,凑合看吧。
0 条评论
沙发空缺中,还不快抢~