[教程]如果在 Delphi 中将一个Java传回的父接口转换成支持的子接口类型

好吧,我原本以为可以直接 as 实现,但现实告诉我想多了,所以这块我们需要额外的处理,基本的逻辑步骤是:

  1. 引用 Androidapi.JNI.JavaTypes 单元,以便我们引用 TJLang_Class。
  2. 使用 TJlang_Class.JavaClass.forName  获取子类的 Java 原生类型信息。
  3. 使用第二步返回的 JavaClass 的 cast 函数转换为新类型。
  4. 如果第三步成功,则调用目标类型的 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 应该和模板,应该可以写出一个相对通用的东西,但这个事情,暂时没时间研究,凑合看吧。

分享到: