zoukankan      html  css  js  c++  java
  • 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 则不行。
     
  • 相关阅读:
    程序如何调取焦点轮换图的每一张图片
    做一个网站程序的小小感悟
    点击repeater的一个修改事件触发全部repeater每一行的修改事件
    将两个时间组合,结果为2015年4月8日-4月10日
    转 c# 日期函数[string.Format----GetDateTimeFormats]格式 .
    关于后台管理linkbutton按钮几个重要属性的理解
    循环repeater中的每一列,并计算数据和
    上传图片2
    isinstance和issubclass
    类和对象的绑定方法和非绑定方法
  • 原文地址:https://www.cnblogs.com/devinzhang/p/4576454.html
Copyright © 2011-2022 走看看