OC 反射-->動態建立類,oc--
建立Class
1 - (Class) createNewClass { 2 const char * className; 3 className = [@"Student" UTF8String]; 4 Class kclass = objc_getClass(className); 5 //判斷此類是否已經存在,如果存在則返回,不存在就建立 6 if (!kclass) 7 { 8 Class superClass = [NSObject class]; 9 kclass = objc_allocateClassPair(superClass, className, 0);10 }11 return kclass;12 }
新增成員變數
1 //新增成員變數2 - (void) addNewVariable:(Class) newClass {3 class_addIvar(newClass, "_stuName", sizeof(NSString *), 0, "@");4 }
擷取Class的成員變數名
1 // 擷取類的成員變數名 2 - (NSArray *)getVariableNamesByObject:(id)object 3 { 4 unsigned int numIvars = 0; 5 // 擷取類的所有成員變數 6 Ivar * ivars = class_copyIvarList([object class], &numIvars); 7 // 定義一個數組來接收穫取的屬性名稱 8 NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:numIvars]; 9 for(int i = 0; i < numIvars; i++) {10 // 得到單個的成員變數11 Ivar thisIvar = ivars[i];12 // 得到這個成員變數的類型13 const char *type = ivar_getTypeEncoding(thisIvar);14 NSString *stringType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];15 // 此處判斷非object-c類型時跳過16 if (![stringType hasPrefix:@"@"]) {17 continue;18 }19 // 得到成員變數名20 NSString *variableName = [NSString stringWithUTF8String:ivar_getName(thisIvar)];21 [nameArray addObject:variableName];22 23 // 這個函數可以得到成員變數的值24 // object_getIvar(object, thisIvar)25 26 }27 free(ivars);28 return nameArray;29 }
調用以後,結果為:
建立方法
第一個參數為類名,第二個參數為方法名,第三個參數是函數名,第四個參數是函數的傳回值和參數的類型,v表是void,@表示id,:表示SEL。更多多定義參考:SELECTOR
1 class_addMethod([kclass class], @selector(say:), (IMP)say, "v@:");
需要實現,這個方法
添加屬性
1 //添加一個屬性2 - (void) addProperties:(Class) newClass {3 NSString *propertyName = @"stuSex";4 objc_property_attribute_t type = { "T", "@\"NSString\"" };5 objc_property_attribute_t ownership = { "C", "copy" };6 objc_property_attribute_t backingivar = { "V", [propertyName UTF8String]};7 objc_property_attribute_t attrs[] = { type, ownership, backingivar };8 BOOL isOk=class_addProperty(newClass, [propertyName UTF8String], attrs, 3);9 }
查看屬性
1 // 擷取類的所有屬性名稱 2 - (NSArray*)getPropertieNamesByObject:(id)object 3 { 4 5 unsigned int outCount, i; 6 7 // 擷取註冊類的屬性列表,第一個參數是類,第二個參數是接收類屬性數目的變數 8 objc_property_t *properties = class_copyPropertyList([object class], &outCount); 9 // 定義一個數組來接收穫取的屬性名稱10 NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:outCount];11 for (i = 0; i < outCount; i++) {12 // 通過迴圈來擷取單個屬性13 objc_property_t property = properties[i];14 // 取得屬性名稱15 NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];16 // 將得到的屬性名稱放入數組中17 [nameArray addObject:propertyName];18 19 }20 free(properties);21 return nameArray;22 }
列印結果: