Reflection反射在iOS下使用Objective-C 具体如何使用 - Go语言中文社区

Reflection反射在iOS下使用Objective-C 具体如何使用


     反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。

程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。


以下本博主在空闲之余,使用Objective-C写了一个demo

https://github.com/VictorZhang2014/ReflectionDemo

每一步的代码意思都已清晰备注,话不多说,以下我粘贴下代码,在Github上有完整的DEMO项目,可以供测试

以下有两个方法

test() 获取当前app运行过程中,由开发者(自己)创建的类的列表,不包括运行时系统创建的类 

test2() 获取当前app运行时所用到所有的文件,包括 系统创建的类和开发者创建的类的 列表

请分开测试

高手请略过

</pre><pre code_snippet_id="1848857" snippet_file_name="blog_20160824_2_1903016" name="code" class="objc">#import "ViewController.h"
#import <objc/runtime.h>
#import <dlfcn.h>
#import <mach-o/ldsyms.h>
#import "MyClass2.h"


//http://stackoverflow.com/questions/19298553/get-list-of-all-native-classes
//这个stackoverflow上有说明

//方式1
//获取当前app运行过程中,由开发者创建的类的  列表
void test()
{
    unsigned int count;
    const char **classes;
    Dl_info info;

    //1.获取app的路径
    dladdr(&_mh_execute_header, &info);

    //2.返回当前运行的app的所有类的名字,并传出个数
    //classes:二维数组 存放所有类的列表名称
    //count:所有的类的个数
    classes = objc_copyClassNamesForImage(info.dli_fname, &count);

    for (int i = 0; i < count; i++) {
        //3.遍历并打印,转换Objective-C的字符串
        NSString *className = [NSString stringWithCString:classes[i] encoding:NSUTF8StringEncoding];
        Class class = NSClassFromString(className);
        NSLog(@"class name = %@", class);

        //根据类名调用
        if ([className isEqualToString:@"MyClass2"]) {
            MyClass2 *my = [[class alloc] init];

            //调用实例方法
            [my test1];

            //调用类方法
            [class test2];
        }

    }
}

//方式2
//获取当前app运行时所用到所有的文件,包括 系统创建的类和开发者创建的类的   列表
void test2()
{
    int numClasses;
    Class * classes = NULL;

    //1.获取当前app运行时所有的类,包括系统创建的类和开发者创建的类的  个数
    numClasses = objc_getClassList(NULL, 0);

    if (numClasses > 0 )
    {
        //2.创建一个可以容纳numClasses个的大小空间
        classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);

        //3.重新获取具体类的列表和个数
        numClasses = objc_getClassList(classes, numClasses);

        //4.遍历
        for (int i = 0; i < numClasses; i++) {
            Class class = classes[i];
            const char *className = class_getName(class);
            NSLog(@"class name2 = %s", className);

            //根据类名调用
            if (strcmp(className, "MyClass2") == 0) {
                MyClass2 *my = [[class alloc] init];

                //调用实例方法
                [my test1];

                //调用类方法
                [class test2];
            }
        }
        free(classes);
    }
}

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    test();
    test2();


}

@end


如果读者有不明白之处,可以留言,本博主会第一时间来回答得意






版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u013538542/article/details/52300804
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 12:46:20
  • 阅读 ( 1266 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢