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<objc/runtime.h>)
 
 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個參數,類型分別爲v、@、:(一個返回值,self,_cmd)。
 
3.深層次對比
 
動態機制:Objective-C runtime 對 class method 的調用是經過全局名稱查詢。而 Java VM 是經過相似 C++ 的虛表機制。因此 Objective-C 能動態的給 class 添加方法,Java 則不行。
相關文章
相關標籤/搜索