java runtime 运行机制,iOS运行时编程(Runtime Programming)和Java的反射机制对比

运行时进行编程,类似Java的反射。运行时编程和Java反射的对比如下:

1.相同点

都可以实现的功能:获取类信息、属性设置获取、类的动态加载(NSClassFromString(@“className”))、方法的动态调用

下面是iOS中涉及到的相关使用方法

类的动态加载:NSClassFromString(@“className”),方法的动态调用:NSSelectorFormString(@”doSonethingMethod:”)

常见的方法:

isKindOfClass: isMemberOfClass:  ; respondsToSelector:   ; conformsToProtocol:  ; methodForSelector: (提供实现方法的地址)

给对象发消息的格式:[receiver message]

objc_msgSend(receiver,selector)

objc_msgSend(receiver,selector,arg1,arg2,...)

动态方法解决:@dynamic propertyName;

消息转发: 消息negotiate负责转发

- negotiate

{

if ( [someOtherObject respondsTo:@selector(negotiate)] )

return [someOtherObject negotiate];

return self;

}

2.不同点:objective-c能动态的给class添加类和方法,Java 则不行。例如:

下面是iOS中涉及到的相关使用方法

API(#import)

Class newClz =objc_allocateClassPair([NSError class],”RuntimeErrorSubclass”,0);

class_addMethod(newClz,@selector(retort), (IMP)ReportFunction, “v@:”);

shiyongobjc_allocateClassPair动态函数创建一个类,并在参数中指明该类的父类和类名。用class_addMethod函数为该类增加了一个方法report,这个方法是由函数ReportFunction实现的,由于该函数至少应包含两个参数self和_cmd,因此该方法有3个参数,[email protected]:(一个返回值,self,_cmd)。

3.深层次对比

动态机制:Objective-C runtime 对 class method 的调用是通过全局名称查询。而 Java VM 是通过类似 C++ 的虚表机制。所以 Objective-C 能动态的给 class 添加方法,Java 则不行。

原文:http://www.cnblogs.com/devinzhang/p/4576454.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值