首页 > 其他分享 >Reflection反射在iOS下使用Objective-C 具体如何使用

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

时间:2023-05-21 23:06:16浏览次数:95  
标签:Reflection 创建 app iOS numClasses className classes Objective class


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

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


以下本博主在空闲之余,使用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



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






标签:Reflection,创建,app,iOS,numClasses,className,classes,Objective,class
From: https://blog.51cto.com/u_14062833/6320518

相关文章

  • iOS的KeyChain(钥匙串)的使用
    iOS的KeyChain(钥匙串)的使用Keychain钥匙串存储账号和密码,还可以多个应用之间分享此账号和密码,只需要配置一项,如下一张图片-1.iOS的keychain提供一种安全保存信息的方式,-2.可以保存密码等数据,而且keychain中的数据不会因为你删除app而丢失,-3.你可以在重新......
  • iOS应用程序之间数据共享
    iOS应用程序间共享数据我们知道由于iOS有安全沙盒机制,应用之间是不能直接访问,但是Apple友好的提供了四种访问机制它们分别是:1.粘贴板      UIPasteboard2.自定义URLScheme   3.AppGroups4.钥匙串以下,就详细的说说它们的原理和具体怎么使用。......
  • iOS上的Popover
    ZRPopoverViewZRPopoverViewisapopoverviewthatpopUIViewwithalistofbuttonbycustomisingeventsandcontents.#1.IfyoulikeinvokethiseventsbyblocksothatChooseNo.1.#2.IfyoulikeinvokethiseventsbydelegatesothatChooseNo.2.Effect......
  • iOS应用通过地址(URL)安装
    目标:iOS应用通过URL地址来安装准备:1.bundleidentifier2.应用图标3.下载地址  完整的下载地址是itms-services://?action=download-manifest&url=https://www.yourdomain.cn/download/2.1.0-10637/test.116d7.56d82df.20170122.test.domain.cn.ipa.plist其中,配置test.116d7.56d8......
  • 14-Filter&Listener&Ajax&Axios&JSON
    1,Filter1.1Filter概述Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。Servlet我们之前都已经学习过了,Filter和Listener我们今天都会进行学习。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。如下图所示,浏览器可以访问服务器上的所有......
  • OpenAI 官宣首个 ChatGPT iOS 应用
    最近,OpenAI宣布推出官方iOS应用,允许用户随时随地访问其高人气AI聊天机器人,此举也打破了近几个月内苹果AppStore上充斥似是而非的山寨服务的窘境。该应用程序是ChatGPT的首个官方移动应用程序。ChatGPT软件程序在去年推出后迅速获得了超过1亿用户,这也让技术行业火速......
  • ChatGPT 推出 iOS 应用,支持语音输入,使用体验如何?
    最近,OpenAI宣布推出官方iOS应用,允许用户随时随地访问其高人气AI聊天机器人,此举也打破了近几个月内苹果AppStore上充斥似是而非的山寨服务的窘境。该应用程序是ChatGPT的首个官方移动应用程序。ChatGPT软件程序在去年推出后迅速获得了超过1亿用户,这也让技术行业火速......
  • iOS视频播放常用重点知识
    iOS视频播放常见的重要知识点如下:视频格式:iOS支持的视频格式主要有H.264、MPEG-4、H.263、Sorenson等。它们根据不同的应用场景进行使用。视频编解码:视频编解码技术是视频播放的核心,它有两部分组成,1.将原始视频数据编码为压缩格式,2.将压缩格式的数据解码成原始视频数据。在iOS中......
  • IOS证书制作教程
    ​转载:IOS证书制作教程 点击苹果证书按钮​编辑 点击新增​编辑 输入证书密码,名称这个密码不是账号密码,而是一个保护证书的密码,是p12文件的密码,此密码设置后没有其他地方可以找到,忘记了只能删除证书重新制作,所以请务必记住密码。还有为了安全起见,密码不要......
  • axios设置请求体
    方式一:json请求方式二:form表单 <template><div>{{msg}}</div></template><script>exportdefault{data:()=>({msg:'',}),created(){constaxios=require('axios......