反射,一種計算機處理方式。是程序可以訪問、檢測和修改它本身狀態或行為的一種能力。
程序集包含模塊,而模塊包含類型,類型又包含成員。反射則提供了封裝程序集、模塊和類型的對象。您可以使用反射動態地創建類型的實例,將類型綁定到現有對象,或從現有對象中獲取類型。然后,可以調用類型的方法或訪問其字段和屬性。
以下本博主在空閑之余,使用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
如果讀者有不明白之處,可以留言,本博主會第一時間來回答
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。