反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。
以下本博主在空闲之余,使用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
如果读者有不明白之处,可以留言,本博主会第一时间来回答