原文引用:http://blog.csdn.net/victormokai/article/details/19631359
java中的反射就是在代码运行中才创建对象,可以获取其中的方法,修改其中的属性值,OC中,也可以进行类似的处理。
代码如下:
#import <Foundation/Foundation.h>
@interface PersonTest : NSObject
+(void) speak;
@end
#import "PersonTest.h"
@implementation PersonTest
+(void) speak
{
NSLog(@" i'm a person !");
}
@end
#import <Foundation/Foundation.h>
#import "PersonTest.h"
@interface StudentTest : PersonTest
{
@private int age;
}
@property(nonatomic) int age;
-(StudentTest *) initAge:(int) _age;
-(void) hobby;
-(void) getScore:(int) score;
-(NSString *) getStudentName: (NSString *) studentName;
@end
#import "StudentTest.h"
@implementation StudentTest
@synthesize age;
-(StudentTest *) initAge:(int) _age
{
self = [super init];
if(self){
self.age = _age;
}
return self;
}
-(void) hobby
{
NSLog(@"学生喜欢玩游戏, 上体育课。");
}
-(void) getScore:(int) score
{
NSLog(@"获取学生的分数---%d",score);
}
-(NSString *) getStudentName: (NSString *) studentName
{
NSLog(@"这个学生的名字----%@",studentName);
return studentName;
}
@end
OC中自带方法来进行“反射”处理。
// 反射 创建对象
Class className = NSClassFromString(@"StudentTest"); // 类适 Class.forName(className)
StudentTest *stu = [[className alloc] init];
NSLog(@"%@",stu);
// 2、-(BOOL)isKindOfClass:(Class)aClass; 判断对象是不是属于指定类型或其子类
Boolean flag = [stu isKindOfClass:[PersonTest class]];
NSLog(@"%d",flag);
if (flag) {
NSLog(@"studentTest 是 personTest的子类");
}else{
NSLog(@"studentTest 不是 personTest的子类");
}
// 3、- (BOOL)isMemberOfClass:(Class)aClass 判断对象是不是属于指定类型
Boolean boolFlag = [stu isMemberOfClass:[PersonTest class]];
NSLog(@"%d",boolFlag);
if(boolFlag){
NSLog(@"stu 是 PersonTest 类型");
}else{
NSLog(@"stu 不是 PersonTest 类型");
}
// 4、- (BOOL)respondsToSelector:(SEL)aSelector 判断类型或对象有没有某个方法
Boolean bool_flag = [stu respondsToSelector:@selector(hobby)]; // 没有参数的方法
NSLog(@"%d",bool_flag);
if (bool_flag) {
NSLog(@"studentTest 类中有 hobby这个方法");
}else{
NSLog(@"studentTest 类中没有这个 hobby这个方法");
}
Boolean score_flag = [stu respondsToSelector:@selector(getScore:)]; // 带有参数的方法
NSLog(@"%d",score_flag);
//同时,对于@selector 还可以通过 字符串生成出来。
SEL sel_flag = NSSelectorFromString(@"getScore:");
Boolean sel_score_flag = [stu respondsToSelector:sel_flag];
NSLog(@"换种方式来进行显示----%d",sel_score_flag);
// 5、- (id)performSelector:(SEL)aSelector 动态调用对象的方法
[stu performSelector:@selector(hobby)]; //调用无参函数
[stu performSelector:@selector(getStudentName:) withObject:@"小强"]; // 调用有参函数
// - (BOOL)conformsToProtocol:(Protocol *)aProtocol; 判断对象是否实现某个Protocol协议
在这些中其中需要注意的是
- (id)performSelector:(SEL)aSelector 动态调用对象的方法。 同时他和后面的IOS中的线程也有关联,先mark一下。
</pre><pre name="code" class="objc">运行结果如下:
2015-01-01 20:38:46.373 OC基础学习[779:43297] <StudentTest: 0x100202050>
2015-01-01 20:38:46.374 OC基础学习[779:43297] 1
2015-01-01 20:38:46.374 OC基础学习[779:43297] studentTest是 personTest的子类
2015-01-01 20:38:46.374 OC基础学习[779:43297] 0
2015-01-01 20:38:46.374 OC基础学习[779:43297] stu不是 PersonTest类型
2015-01-01 20:38:46.375 OC基础学习[779:43297] 1
2015-01-01 20:38:46.375 OC基础学习[779:43297] studentTest类中有 hobby这个方法
2015-01-01 20:38:46.375 OC基础学习[779:43297] 1
2015-01-01 20:38:46.375 OC基础学习[779:43297]换种方式来进行显示----1
2015-01-01 20:38:46.375 OC基础学习[779:43297]学生喜欢玩游戏,上体育课。
2015-01-01 20:38:46.375 OC基础学习[779:43297]这个学生的名字----小强