首页 > 其他分享 >Objective-C的反射

Objective-C的反射

时间:2023-04-30 21:10:21浏览次数:42  
标签:反射 Java 一个 isKindOfClass Objective 方法


http://blog.sina.com.cn/s/blog_6d723b1f0100q6m6.html


   我第一次接触Java的时候就觉得整个反射包都很新颖,它使得Java和解释型的脚本语言更接近了,与此同时也拉开了和主流的C和C++的距离。 在运行时可以窥视到一个对象的类元数据真的很不可思议,尽管这些可能不会在日常应用编程中经常使用到。从Java转到Objective-C的程序员应该会乐见Objective-C也支持反射。实际上,Objective-C有很多诸如动态改变类定义以及创建一个新类的动态特征。不过很难说这些功能有多大的作用,这也让我觉得Objective-C是一个有些臃肿的语言。在我看来,Objective-C有一个定位危机:它是解释型语言还是编译语言?运行时很大程度上是动态的。和C++不同,Objective-C是运行时绑定的。这也是为什么我们可以在实现时定义一个从来没有在头文件中声明的方法,或者通过Category扩展类。不幸的是由于这种臃肿使得找到一些日常编程中有用的东西变得困难,本文就是要去发现其中的一些“宝藏”。

根类NSObject

   大部分(如果不是全部的话)的动态反射支持来自NSObject 类。和Java的Object对象类似,NSObject是所有类(除了一些很少见的例外)的根类。所以所有你写的类应该都可以支持反射。需要指出的所有这些的反射支持并不是Objective-C语言的一部分,而是源于NS*的运行时环境。这也是为什么这些东西感觉被加入一些额外东东的原因。因为它就是被加入了额外东东。

获取类的元数据     通过调用如下的类方法你就可以获取到一个对象的类的元数据:

  1. c = [self class];  

   该方法既是实例方法也是类方法。它返回一个带有很多神奇信息的C构造体,比如实例变量、方法等等。所有这些和java.lang.reflect包相比都有些过时了,利用Objective-C访问这些信息的接口看起来很复杂。这可能就是故意设计成这样来“过滤”一些不合格的程序员。目前为止我唯一使用这些的地方就是为下面将要介绍的isKindOfClass:方法提供参数。一直以来我都不需要去窥视类结构的内容。

动态方程调用     我已经在方法调用一文中介绍了反射的一个方面。这使得你可以在运行时创建一个方法调用并传入参数。这和Java中使用java.lang.reflect.Method类很相似。

检查继承关系

   Java有一个名为instanceof的操作符可以用来检查一个对象是否是一个特定类或者接口的实例。 Objective-C也有类似的功能,就是通过isKindOfClass:方法。isKindOfClass:会在消息接收者是指定类及其子类的实例的情况下返回YES。比如有一个关联的指针数组,这样就可以根据其类型进行不同的操作:

1. base in myArray) {   
2. isKindOfClass:[ClassOne class]]) {   
3.     // do stuff specific to ClassOne   
4.   
5. if([base isKindOfClass:[ClassTwo class]]) {   
6.     // do stuff specific to ClassTwo   
7.   
8. if([base isKindOfClass:[ClassThree class]]) {   
9.     // do stuff specific to ClassThree   
10.   
11. etc   
12. }


    如果你需要一个精确的类匹配,而不是匹配任何继承类,你就可以使用isMemberOfClass:方法。

检查是否符合协议     和实例检查类似,你可以测试一个对象是否符合特定的协议。Java在类和接口的情况下都使用instanceof 方法搞定,但Objective-C使用了一个更笨重的方法。在测试是否合规的时候,应该使用conformsToProtocol:方法:

  1. conforms = [obj conformsToProtocol:@protocol(MyInterface)];  

检查方法是否存在     对于像我这样Java和C++的老手来说,如果不知道一个对象是否实现了一个方法就很奇怪了。但是Objective-C的类很大程度上是动态的,你就需要检查你需要的方法是否存在。这就需要respondsToSelector:方法。如下代码就是检查接收者是否实现(或者继承)了指定方法:

  1. respondsToSelector:@selector(aMethod:)]) { // it's there, so we can call it [obj aMethod:YES]; }  

   当然,利用Objective-C的反射,你可以做更多的事情,这里我只是尝试谈谈反射机制最常见的应用。如果你需要在你的软件中加入核心的动态特性,你就需要熟悉下这些文档:Runtime Programming Guide: IntroductionRuntime Reference

标签:反射,Java,一个,isKindOfClass,Objective,方法
From: https://blog.51cto.com/u_548275/6238222

相关文章

  • 通过反射获取进行字段赋值
    业务场景背景在以日期维度展示数据时,数据库中保存的数据一般会制作成宽表的形式比如:(id,projectNmae,projectID,indicator_name,indicator_value1,indicator_value1...,day)根据indicator_name获取对应指标,根据indicator_value获取对应周期数据,比如indicator_value1代表(day-1)问......
  • 通过反射获取进行字段赋值
    业务场景背景在以日期维度展示数据时,数据库中保存的数据一般会制作成宽表的形式比如:(id,projectNmae,projectID,indicator_name,indicator_value1,indicator_value1...,day)根据indicator_name获取对应指标,根据indicator_value获取对应周期数据,比如indicator_value1代表(day-1)问......
  • 网路编程和反射
    网路编程CS:客户端与服务器BS:浏览器和服务器协议公开数据安全存在问题(目前加密算法很厉害) 1.网络协议:遵循网路数据传输规则TCP/IP协议4层 视频语音需要对方同意UDP协议 7层 发消息收到没收到都行应用层传输层网络层链路层 2.IP地址和端口号ipv4ipv6通过IP地......
  • Java通过反射给final对象赋值(代码库)
    直接赋值会报错Methodthrew'java.lang.UnsupportedOperationException'exception.给没有set方法的类如下赋值publicstaticvoidsetFieldValue(Objectobj,StringfieldName,Objectval){if(isEmpty(obj)||isEmpty(fieldName))return;ClasssuperClas......
  • Java 反射机制的一个简单例子.
    一、什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++、Open......
  • 反射实现Hello World(注解的使用)
    注解中的元数据包括Target,Rentention,Inherited,Documented。注解:publicinterfaceAnnotationThecommoninterfaceextendedbyallannotationtypes.Notethataninterfacethatmanuallyextendsthisonedoesnotdefineanannotationtype.Alsonotethatthisinterf......
  • C#用dynamic一行代码实现反射操作
    dynamic简介dynamic是.NETFramework4.0的新特性。dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译时默认dynamic对象支持你想要的任何特性。dynamic简化反射实现使用dynamic来简化反射实现是一种比较常见的编程技巧,它可以减少代码的复杂......
  • java -- 枚举和反射
    枚举枚举概述枚举是JDK1.5新增的引用数据类型,和类,接口是一个级别的,定义枚举的关键字为enum。java.lang.Enum类,是所有枚举的父类。枚举的本质就是一个类的多个对象。枚举的定义格式:publicenmu枚举名{}枚举常量定义:枚举中的常量名字大写,多个常量之间逗号分开,最后一个常......
  • 通过反射获取进行字段赋值
    业务场景背景在以日期维度展示数据时,数据库中保存的数据一般会制作成宽表的形式比如:(id,projectNmae,projectID,indicator_name,indicator_value1,indicator_value1...,day)根据indicator_name获取对应指标,根据indicator_value获取对应周期数据,比如indicator_value1代表(da......
  • 什么是反射?
    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。反射的使用?在Java中,Class类与java.lang.reflect类库一起对反射技术进行......