object c++如何实现反射机制

来源:互联网 发布:node全栈开发实战 编辑:程序博客网 时间:2024/06/15 00:32

object c++如何实现反射机制

    博客分类: 
  • iphone
 

object c++如何实现反射机制

 

开发语言的反射机制为我们提供了发挥想象力的基础,通过反射可以设计出各种5花8门的架构来。

 

参考网上各种资料,Object c++的反射主要依靠下面的2个函数。

 

 

NSClassFromString

 

NSSelectorFromString

 

 

下面直接摆上例子,一目了然。

 

 

(一)通过一个字符串来创建对象并调用对象中的方法。

 

文件:Member.h

 

Cpp代码  收藏代码
  1. //  Member.h  
  2. #import <Foundation/Foundation.h>  
  3.   
  4. @interface Member : NSObject {  
  5.     NSString *name;  
  6.     int age;  
  7. }  
  8.   
  9. @property (nonatomic,copy) NSString *name;  
  10. @property int age;  
  11.   
  12.   
  13. @end  
 

文件Member.m

 

Cpp代码  收藏代码
  1. //  Member.m  
  2. #import "Member.h"  
  3.   
  4. @implementation Member  
  5.   
  6. @synthesize name,age;  
  7.   
  8. @end  
 

 

 

测试代码文件Sample01.m:

 

Cpp代码  收藏代码
  1. #import <Foundation/Foundation.h>  
  2.   
  3. int main (int argc, const char * argv[]) {  
  4.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  5.       
  6.     //定义类名  
  7.     NSString *className=@"Member";  
  8.     //定义方法名  
  9.     //注意:方法名后面要根据参数来设置,这里的setName:,表示setName  
  10.     //     方法后面有1个参数  
  11.     NSString *methodName=@"setName:";  
  12.       
  13.     //取得类并分配内存和初始化  
  14.     id obj=[[NSClassFromString(className) alloc] init];  
  15.     //调用类方法  
  16.     [obj performSelector: NSSelectorFromString(methodName) withObject:@"Tom and Jerry."];  
  17.     //显示  
  18.     NSLog(@"%@",[obj name]);  
  19.       
  20.     [pool drain];  
  21.     return 0;  
  22. }  
 

 

代码执行后,显示如下:

 

 

2012-03-16 17:41:31.962 Sample01[39762:1307] Tom and Jerry.

 

 

 

 

由上面例子发现:

(1)在反射时,不需要使用import引入要反射的类;

(2)在定义反射类方法名时要注意后面的冒号,必须根据参数数量和原类方法名设置。

 

 

 

(二)通过字符串获取类的全部属性。

 

对上面的例子进行调整,如下面代码:(注意:在头部要引入头文件 objc/runtime.h

 

 

Cpp代码  收藏代码
  1. #import <Foundation/Foundation.h>  
  2. #import <objc/runtime.h>  
  3.   
  4. int main (int argc, const char * argv[]) {  
  5.     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];  
  6.       
  7.     //定义类名  
  8.     NSString *className=@"Member";  
  9.     //定义方法名  
  10.     //注意:方法名后面要根据参数来设置,这里的setName:,表示setName  
  11.     //     方法后面有1个参数  
  12.     NSString *methodName=@"setName:";  
  13.       
  14.     //取得类并分配内存和初始化  
  15.     id obj=[[NSClassFromString(className) alloc] init];  
  16.     //调用类方法  
  17.     [obj performSelector: NSSelectorFromString(methodName) withObject:@"Tom and Jerry."];  
  18.     //显示  
  19.     NSLog(@"%@",[obj name]);  
  20.       
  21.     //定义类属性的数量  
  22.     unsigned propertyCount;  
  23.     //获取对象的全部属性并循环显示属性名称和属性特性参数  
  24.     objc_property_t *properties = class_copyPropertyList([obj class],&propertyCount);  
  25.     for(int i=0;i<propertyCount;i++){  
  26.         objc_property_t prop=properties[i];  
  27.         NSLog(@"property:%s",property_getName(prop));  
  28.         NSLog(@"property_getAttributes:%s",property_getAttributes(prop));  
  29.     }  
  30.       
  31.   
  32.     [pool drain];  
  33.     return 0;  
  34. }  
 

代码执行后,显示结果如下:

 

2012-03-19 16:40:04.345 Sample01[41713:1307] Tom and Jerry.

2012-03-19 16:40:04.350 Sample01[41713:1307] property:age

2012-03-19 16:40:04.352 Sample01[41713:1307] property_getAttributes:Ti,Vage

2012-03-19 16:40:04.354 Sample01[41713:1307] property:name

2012-03-19 16:40:04.355 Sample01[41713:1307] property_getAttributes:T@"NSString",C,N,Vname

 

 

关于属性的特性参数可以参考官方文档说明:

 

Property Type String

You can use the property_getAttributes function to discover the name, the @encodetype string of a property, and other attributes of the property.

The string starts with a T followed by the @encode type and a comma, and finishes with a V followed by the name of the backing instance variable. Between these, the attributes are specified by the following descriptors, separated by commas:

Table 7-1  Declared property type encodings

Code

Meaning

R

The property is read-only (readonly).

C

The property is a copy of the value last assigned (copy).

&

The property is a reference to the value last assigned (retain).

N

The property is non-atomic (nonatomic).

G<name>

The property defines a custom getter selector name. The name follows the G (for example, GcustomGetter,).

S<name>

The property defines a custom setter selector name. The name follows the S (for example, ScustomSetter:,).

D

The property is dynamic (@dynamic).

W

The property is a weak reference (__weak).

P

The property is eligible for garbage collection.

t<encoding>

Specifies the type using old-style encoding.



0 0
原创粉丝点击