object c++如何实现反射机制
开发语言的反射机制为我们提供了发挥想象力的基础,通过反射可以设计出各种5花8门的架构来。
参考网上各种资料,Object c++的反射主要依靠下面的2个函数。
NSClassFromString
NSSelectorFromString
下面直接摆上例子,一目了然。
(一)通过一个字符串来创建对象并调用对象中的方法。
文件:Member.h
文件Member.m
测试代码文件Sample01.m:
代码执行后,显示如下:
2012-03-16 17:41:31.962 Sample01[39762:1307] Tom and Jerry.
由上面例子发现:
(1)在反射时,不需要使用import引入要反射的类;
(2)在定义反射类方法名时要注意后面的冒号,必须根据参数数量和原类方法名设置。
(二)通过字符串获取类的全部属性。
对上面的例子进行调整,如下面代码:(注意:在头部要引入头文件 objc/runtime.h)
代码执行后,显示结果如下:
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
关于属性的特性参数可以参考官方文档说明:
You can use the property_getAttributes
function to discover the name, the @encode
type 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:
Code
Meaning
|
The property is read-only ( |
|
The property is a copy of the value last assigned ( |
|
The property is a reference to the value last assigned ( |
|
The property is non-atomic ( |
|
The property defines a custom getter selector name. The name follows the |
|
The property defines a custom setter selector name. The name follows the |
|
The property is dynamic ( |
|
The property is a weak reference ( |
|
The property is eligible for garbage collection. |
|
Specifies the type using old-style encoding. |