主要方法和类型

Class 变量名 = [类或者对象 class];

Class 变量名  = [类或者对象 superclass];

Class 变量名  = NSClassFromString(方法名字的字符串);

NSString *变量名 = NSStringFromClass(Class 参数);

•通过类名的字符串形式实例化对象
Class class = NSClassFromString(@"Student");
id obj = [[class alloc]init];

NSLog(@"创建的对象为: %@",obj);

将类名转换为字符串
NSString *className = NSStringFromClass(class);
NSLog(@"类名:%@",className);
对象在运行时获取其类型的能力称为内省
ObjC具有很多动态特性
而在实际使用中,使用introspection来确定该对象的实际所属类:
NSObject 提供了一些简单的查询运行时系统信息的方法:
 
- (BOOL)isKindOfClass:(Class)aClass 
判断对象是不是属于指定类型或其子类
- (BOOL)isMemberOfClass:(Class)aClass 
判断对象是不是属于指定类型
+ (BOOL)isSubclassOfClass:(Class)aClass;
判断一个类型是否是另一个类型的子类型
 
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
判断某个类/对象是否实现某个协议
使用@protocol封装后传入
// - (BOOL)conformsToProtocol:(Protocol *)aProtocol;       
[student conformsToProtocol:@protocol(MyProtocol)];     
// 或者使用类方法       
// + (BOOL)conformsToProtocol:(Protocol *)protocol;       
[Student conformsToProtocol:@protocol(MyProtocol)];
 
对象复合(composition),即对象中又包含对象,表达的时“has a”的关系;
向对象中的对象发送消息:使用嵌套的中括号,如:
[tom cardWithNumber:9999]draw:1000];
访问对象中的对象的属性,使用连续的点操作符,如:
tom.car.balance
注意:中括号和点操作符不能同时使用!!
 
 
 
Person *p = [[Person alloc]init];
    Class c = [p class];
//    NSLog(@"第一个%@",c);
    Teacher *t=[[Teacher alloc]init];
    c = [t class];
  //  NSLog(@"wo shi %@",c);
    Student *tom = [[Student alloc]init];
    c = [tom class];
  //  NSLog(@"第二个%@",c);
    
    Student *jack = [[Student alloc]init];
    Class j = [jack superclass];
    NSLog(@"第三个%@",j);
    
    if ([tom isMemberOfClass:[Person class]]) {
        NSLog(@"tom is a person");
    }
    else{
        NSLog(@"tom is not a person");
    }
    
     if ([jack isMemberOfClass:[Student class]])
     {
         NSLog(@"jack is a student");
     }
    else
     {
        NSLog(@"jack is not a student");
     }
    
    //测试class的反射
    
    Class class = NSClassFromString(@"Student");
    id obj = [[class alloc]init];
    NSLog(@"创建的对象为: %@",obj);
    
    NSString *className = NSStringFromClass(class);
    NSLog(@"类名:%@",className);
    //调用方法
    //Person *p = [[Person alloc]init];
    if ([p respondsToSelector:@selector(speak)]) {
        [p performSelector:@selector(speak)];
        
    }
    
    if ([p respondsToSelector:@selector(speak)]) {
        NSLog(@"speak");
    }
    
    if ([p respondsToSelector:@selector(setAge:)]) {
        NSLog(@"setAge");
    }
    
    if ([p respondsToSelector:@selector(speakWith:at:)]) {
        Person *p2 = [[Person alloc]init];
        [p speakWith:p2 at:@"KFC"];
        [p performSelector:@selector(speakWith:at:) withObject:p2 withObject:@"中餐厅"];
      
    }
    
    
    //isSubclassOfClass的使用
    BOOL flag = [Person isSubclassOfClass:[Student class]];
    if (flag) {
        NSLog(@"yes");
    }
    else{
        NSLog(@"no");
    }
    
    
    BOOL flag2 = [Student isSubclassOfClass:[Person class]];
    if (flag2) {
        NSLog(@"yes");
    }
    else
    {
        NSLog(@"no");
    }
    
    //判断Person类是否实现了MyProtocol协议
    if ([tom conformsToProtocol:@protocol(MyProtocol)]) {
        NSLog(@"tom 实现了协议");
    }
   

Object-C-Foundation-反射的更多相关文章

  1. [CareerCup] 14.5 Object Reflection 对象反射

    14.5 Explain what object reflection is in Java and why it is useful. Java中的对象反射机制可以获得Java类和对象的反射信息,并 ...

  2. Object 反射 List

    public static object DeserializeModel<T>(object dataModel) { Type type = typeof(T); Object ent ...

  3. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  4. day27_反射

    1.反射-概述(掌握) 反射就是在程序运行过程中,通过.class文件动态的获取类的信息(属性,构造,方法),并调用 注意:JAVA不是动态语言,因为动态语言强调在程序运行过程中不仅能获取并调用类里面 ...

  5. 反射——反射API,使用反射创建数组

    反射API Java.lang.Reflect库 ①   Class类与Java.lang.Reflect类库一起对反射的概念进行支持. ②   java.lang包下: a)         Cla ...

  6. java反射的基础学习代码

    java反射的学习,好多东西不太理解,主要分析了constructor,method,field,数组和调用main函数等反射的多个方面小例子. 主要的练习类 package javaAdvanced ...

  7. Java的反射机制(Reflection)

    反射机制 指可以在运动时加载.探知.使用编译期间完全未知的类 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够获取这个类的属性和方法:对于任意一个对象可以调用它的任意一个 ...

  8. C#的反射机制

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

  9. 黑马程序员:Java编程_反射技术

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性 ...

  10. java_ _反射

    Java语言的反射机制初步学习 首先看下基本概念: (一)在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取 ...

随机推荐

  1. crm项目整理

    crm项目整理   一.开发背景 由于公司人员的增多,原来通过excel表格存取方式过于繁琐,而且对于公司人员的调配和绩效考核等不能做到精确处理,所以开发crm系统,开始开发只是针对销售人员和客户,后 ...

  2. HTML5上传文件显示进度

    下面我们使用Html 5的新特性file api实现上传文件,并显示上传文件进度百分比.意图是这样的,当选择文件时,显示当前文件信息.这里我们是结合Asp.net MVC做为服务端,您也可以是其它的服 ...

  3. ELKstack5.6.5

    ELKstack 安装: 一:环境准备: 1.给添加块磁盘50G,相当于模拟raid 2.分别给它们做本机的主机解析 [root@node01 ~ ]#cat  /etc/hosts 127.0.0. ...

  4. hotplug 热拔插机制框架

    框架入口源文件: mdev.c (可根据入口源文件,再按着框架到内核走一遍) 内核版本:linux_2.6.22.6     硬件平台:JZ2440 以下是驱动框架:

  5. 集合求交集 & 去除列表中重复的元素

    集合求交集: set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 交集:set3 = set1 & set2 print(ste3) #结果为{4,5} 或者ste1. ...

  6. [MySQL 5.6] information_schema.innodb_metrics

    1. 概括 已关闭/打开的配置 use information_schema select count(*), status from innodb_metrics group by status; ...

  7. intellij idea建立maven项目

    配置jdk 配置mvn http://jingyan.baidu.com/article/d8072ac45d3660ec94cefd51.html 右键“计算机”,选择“属性”,之后点击“高级系统设 ...

  8. Magento 2数据库EAV模型结构

     EAV模型是一种数据模型 ,用于描述实体的数量预计会很大,但事实上,实体中要使用的属性数量并不多. Magento 2这么设计是为了灵活性,在不影响主干的基础上,任意新增删除属性. EAV模型(E ...

  9. Kinect2.0获取数据

    最近事情真是多,今天抽空研究一下Kinec2.0的数据获取! 系统要求 https://developer.microsoft.com/en-us/windows/kinect/hardware-se ...

  10. vue-devtools : vue的调试工具及log显示工具 vconsole

    使用 devtools 有很多好处,比如它可以让你能够实时编辑数据属性并立即看到其反映出来的变化.另一个主要的好处是能够为 Vuex 提供时间旅行式的调试体验. 注意:请留意如果页面使用了一个生产环境 ...