美文网首页程序员
OC通过runtime反射获取所有实例方法和类对象方法(静态方法

OC通过runtime反射获取所有实例方法和类对象方法(静态方法

作者: 何景根 | 来源:发表于2020-11-19 17:26 被阅读0次

本文主要阐述Objective-C如何通过runtime反射获取方法并调用
属性和变量的反射遍历可以参考https://www.jianshu.com/p/1a03524d6668

引入头文件

#import <objc/runtime.h>

获取类实例方法

Class currentClass=NSClassFromString(@"DlibClass");
    do{
        unsigned int methodCount;
        
        Method *methodList = class_copyMethodList(currentClass, &methodCount);
        unsigned int i = 0;
        for (; i < methodCount; i++) {
            SEL sel=method_getName(methodList[i]);
            NSString *strClassName=[NSString stringWithCString:class_getName(currentClass) encoding:NSUTF8StringEncoding];
            NSString *strMethodName=[NSString stringWithCString:sel_getName(sel) encoding:NSUTF8StringEncoding];
            NSLog(@"class:%@ method:%@", strClassName,strMethodName);
        }
        
        free(methodList);
        currentClass = class_getSuperclass(currentClass);
        
    }while(currentClass);

获取类方法(静态方法)

    Class currentClass=objc_getMetaClass("DlibClass");
    do{
        unsigned int methodCount;
        
        Method *methodList = class_copyMethodList(currentClass, &methodCount);
        unsigned int i = 0;
        for (; i < methodCount; i++) {
            SEL sel=method_getName(methodList[i]);
            NSString *strClassName=[NSString stringWithCString:class_getName(currentClass) encoding:NSUTF8StringEncoding];
            NSString *strMethodName=[NSString stringWithCString:sel_getName(sel) encoding:NSUTF8StringEncoding];
            NSLog(@"class:%@ method:%@", strClassName,strMethodName);
        }
        
        free(methodList);
        currentClass = class_getSuperclass(currentClass);
    
        
    }while(currentClass);

反射创建类实例

 Class Dcls=NSClassFromString(@"DlibClass");
 id dobj=[[Dcls alloc] init];

反射创建无类实例(也叫类对象)

 Class currentClass=objc_getMetaClass("DlibClass");
 id dclsobj=[[currentClass alloc] init];

根据@selector调用相应对象方法

 IMP imp = [dobj methodForSelector:sel];
MyClass *(*func)(void) = (void *)imp;
MyClass *ret=func();
NSLog(@"%@",ret);

相关文章

  • OC通过runtime反射获取所有实例方法和类对象方法(静态方法

    本文主要阐述Objective-C如何通过runtime反射获取方法并调用属性和变量的反射遍历可以参考https:...

  • Objective-C OC通过runtime反射获取变量和属性

    本文主要阐述Objective-C如何通过runtime反射获取变量和属性并获取相应的值反射获取方法以及静态方法以...

  • OC&iOS

    OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...

  • 再论静态方法和类方法

    实例对象可以调用实例方法、类方法、静态方法 类对象只能调用类方法、静态方法

  • Swift 中的方法声明

    实例方法 类方法 静态方法 实例方法由实例对象进行调用;类方法和静态方法由类对象进行调用

  • Swift 方法

    方法分为:实例方法、类方法。 类似于OC中的-方法,+方法 实例方法(Instance Method)通过实例对象...

  • JS实例属性/方法、静态属性/方法、私有属性/方法、原型属性/方

    实例属性/方法 & 静态属性/方法 实例属性/实例方法通过对象调用 静态属性/静态方法用类名直接调用 私有属性/方...

  • 反射机制(四)操作方法

    获取方法: 调用方法 问题一答案: 使用反射调用可变参数 使用反射调用静态方法: 静态方法不属于任何对象,属于类本...

  • kvc

    C++中,若类的方法前加了static关键字,则该方法称为静态方法,反之为实例方法。静态方法为类所有,可以通过对象...

  • Java 反射

    Java反射Java反射API获取Class对象通过反射创建实例对象,调用公共方法通过反射调用私有方法 一.Jav...

网友评论

    本文标题:OC通过runtime反射获取所有实例方法和类对象方法(静态方法

    本文链接:https://www.haomeiwen.com/subject/zejliktx.html