j2objc升级至2.8后原生iOS类反射功能不可用问题问询
可以为原生iOS类手动实现j2objc定义的__metadata元数据方法,适配其反射规则,具体实现方案和规则如下:
报错原因
j2objc的反射能力依赖类提供的__metadata元数据,只有j2objc翻译生成的类默认携带该方法,原生Objective-C类未实现该方法时,就会触发ReflectionStrippedError报错,和是否开启--strip-reflection参数无关。
元数据实现规则
你需要为IosApplicationSupport类实现+ (const J2ObjcClassInfo *)__metadata类方法,返回的J2ObjcClassInfo结构体需要包含以下核心信息:
modifiers:类的Java修饰符,公共类填JAVA_MOD_PUBLIC即可name:Java侧对应类的全限定名,要和你classForIosName:查询的名称完全匹配superclass:父类的元数据指针,继承自NSObject则填[NSObject __metadata]interfacesCount:实现的接口数量,这里实现了IApplicationSupport接口所以填1interfaces:指向实现的接口的元数据指针数组,这里填(const J2ObjcClassInfo **)&[IApplicationSupport __metadata]methodsCount:需要暴露给反射的方法数量methods:方法信息结构体数组,每个元素要包含方法名、Java方法签名、修饰符- 没有需要反射的字段时,
fieldsCount设为0,fields设为NULL即可
代码示例
首先导入依赖头文件:
#import <J2ObjC/J2Objc.h> #import "IApplicationSupport.h" // j2objc翻译生成的接口头文件
在IosApplicationSupport.m中添加元数据实现:
@implementation IosApplicationSupport // 先定义静态常量存储元数据,避免重复创建 static const J2ObjcClassInfo *IosApplicationSupport_metadata; + (const J2ObjcClassInfo *)__metadata { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 定义要暴露的方法列表:这里只有openSupport方法 static const J2ObjcMethodInfo methods[] = { { .name = "openSupport", .signature = "()V", // 对应void返回值、无参数的方法签名 .modifiers = JAVA_MOD_PUBLIC, } }; // 定义实现的接口列表 static const J2ObjcClassInfo *interfaces[] = { [IApplicationSupport __metadata] }; // 构造类元数据 J2ObjcClassInfo *info = malloc(sizeof(J2ObjcClassInfo)); info->modifiers = JAVA_MOD_PUBLIC; info->name = "com/yourpackage/IosApplicationSupport"; // 替换为你Java侧实际的类全限定名 info->superclass = [NSObject __metadata]; info->interfacesCount = 1; info->interfaces = interfaces; info->methodsCount = 1; info->methods = methods; info->fieldsCount = 0; info->fields = NULL; IosApplicationSupport_metadata = info; }); return IosApplicationSupport_metadata; } // 你的原有openSupport实现 - (void)openSupport { // iOS侧原有逻辑 } @end
简化实现技巧
如果手动写元数据容易出错,可以先在Java侧写一个和IosApplicationSupport完全一致的空实现类,用j2objc正常翻译该类,将翻译生成的.m文件中的__metadata方法直接复制到你原生的IosApplicationSupport类中即可,无需手动拼接结构体。
内容的提问来源于stack exchange,提问作者Accid Bright
相关产品推荐
相关产品推荐

