首页 > 学院 > 开发设计 > 正文

OC反射机制获得该类全部属性并创建数据表

2019-11-14 20:01:06
字体:
来源:转载
供稿:网友

1. 首先我们要知道,这使用的是运行时的反射机制

所以我们需要头文件 runtime.h

 1 - (BOOL) createTableByClassAttributes: (id)classModel { 2      3     // 得到类名 当表名、  也为了下边的反射、 4     NSString *className = NSStringFromClass([classModel class]); 5      6     // 初始化一个装sql的可变string 7     NSMutableString * sqlQuery = [NSMutableString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (", className]; 8      9     const char * cClassName = [className UTF8String];10     11     id classM = objc_getClass(cClassName);12     // i 计数 、  outCount 放我们的属性个数13     unsigned int outCount, i;14     // 反射得到属性的个数 、15     objc_PRoperty_t * properties = class_copyPropertyList(classM, &outCount);16     17     // 循环 得到属性名称  拼接数据库语句18     for (i = 0; i < outCount; i++) {19         objc_property_t property = properties[i];20         // 获得属性名称21         NSString * attributeName = [NSString stringWithUTF8String:property_getName(property)];22         23         if (i == outCount - 1) {24             [sqlQuery appendFormat:@"%@ TEXT)", attributeName];25             break;26         }27         // 开始做拼接28         [sqlQuery appendFormat:@"%@ TEXT, ", attributeName];29     }30     31     if ([self openDatabase] == YES) {32         33         char * error;34         int result = sqlite3_exec(_db, [sqlQuery UTF8String], NULL, NULL, &error);35         if (result == SQLITE_OK) {36             return YES;37         } else {38             NSLog(@"%@", [self errorWithMessage:[NSString stringWithFormat:@"%s", error]]);39             return NO;40         }41     } else {42         NSLog(@"%@", [self errorWithMessage:@"openDB Failure"]);43         return NO;44     }45 }

// 当然 这是在数据库中写的, 你可能需要导入libsqlite这个库并创建数据库才能看见他的真正效果

ps: 运行时,我们可以得到某个类的全部属性,包括属性名称,值, 类型, 同事也可以得到方法的名称。 

这里用的是纯c的语言。

这里讲反射, 主要是给大家讲一下这一种思路。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表