objective-c(反射)

objective-c中提供类似JAVA的反射特性,给出基本例子如下:

#import <Foundation/Foundation.h>

@interface ClassA : NSObject{
    int _id1;
    int _id2;
    int _id3;
}

@property int _id1;
@property int _id2;
@property int _id3;

-(void) setId1:(int)id1 andId2:(int)id2 andId3:(int)id3;
-(void) doMethod1;
-(void) doMethod2;
-(void) doMethod3;

@end

@implementation ClassA

@synthesize _id1,_id2,_id3;

-(void) setId1:(int)id1 andId2:(int)id2 andId3:(int)id3{
    _id1 = id1;
    _id2 = id2;
    _id3 = id3;
}

-(void) doMethod1{
    NSLog(@"%i", self._id1);}

-(void) doMethod2{
    NSLog(@"%i", self._id2);}

-(void) doMethod3{
    NSLog(@"%i", self._id3);}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Class class = NSClassFromString(@"ClassA"); //通过字符串获取CLASS
        NSLog(@"%@", [class className]); //打印class的名称,在oc中class是一个结构体
        NSObject *tmp;

        SEL sel1 = @selector(doMethod2); //SEL对应选择一个方法
        SEL sel2 = NSSelectorFromString(@"doMethod1");
        SEL sel3 = NSSelectorFromString(@"setId1:andId2:andId3:");
        tmp = [[class alloc]init];
                //判断实例中是否包含这个方法,类似的还有是否属于某一个类等接口
        if([tmp respondsToSelector:sel3] == YES) {
                    //oc中反射的基本函数performSelector不支持传入基本参数,如int,以及多个参数,解决的方法有很多种,            //比如可以在设计中就将参数进行封装,下面这个方法是通过NSInvocation传入参数;
            NSInvocation *inv = [NSInvocation invocationWithMethodSignature:
                                 [tmp methodSignatureForSelector:sel3]];

            [inv setSelector:sel3];
            [inv setTarget:tmp];

            //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation
            int input1 = 1;
            int input2 = 2;
            int input3 = 3;

            [inv setArgument:&(input1)  atIndex:2]; //第一个参数传入
            [inv setArgument:&(input2)  atIndex:3]; //第二个参数传入
            [inv setArgument:&(input3)  atIndex:4]; //第三个参数传入
            [inv invoke];
        }

        [tmp performSelector:sel1 withObject:nil]; //执行该方法

        if([tmp respondsToSelector:sel2] == YES) {
            [tmp performSelector:sel2 withObject:nil];
        }

    }
    return 0;
}
时间: 2024-10-09 23:37:53

objective-c(反射)的相关文章

Objective C Foundation基础框架[转]

<pre class="cpp" name="code">iOS Foundation基础框架就是以Foundation.h头文件的库 #import <Foundation/Foundation.h> Mac OS X和iOS都使用了Foundation基础框架.该框架中有很多日后开发常用的API,非常基础重要.以下就常用的类和结构做个介绍. NSObjct NSObject类,是ObjC类族中的根类.NSObject有一些高级特性支持,在

Objective c类的初始化

Objective c中实现类的初始化要先重载父类的init方法: 1.首先调用[super init]使用父类的方法进行初始化.将对象赋给self 2.假设self不为nil即父类初始化成功,接着进行本类的初始化 3.返回self给调用者 @implementation Test -(id)init {     if(self = [super init])     {         //本类的初始化代码 //..........     }     return self;      }

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v

.Net 反射

反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使这个对象的类型在编译时还不知道.     反射的用途:    (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例.     (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全

C#图解教程 第二十四章 反射和特性

反射和特性元数据和反射Type 类获取Type对象什么是特性应用特性预定义的保留的特性Obsolete(废弃)特性Conditional特性调用者信息特性DebuggerStepThrough 特性其他预定义特性有关应用特性的更多内容多个特性其他类型的目标全局特性自定义特性声明自定义特性使用特性的构造函数指定构造函数使用构造函数构造函数中的位置参数和命名参数限制特性的使用自定义特性的最佳实践访问特性使用IsDefined方法使用GetCustomAttributes方法 Note 类的元数据包含

Java反射

1. 介绍 反射是一种能够在程序运行时动态访问.修改某个类中任意属性和方法的机制. 具体:对于任意一个类,都能够知道这个类的所有属性和方法对于任意一个对象,都能够调用它的任意一个方法和属性 在运行时,当加载完类之后,JVM在堆内存中会自动产生一个Class类型的对象,这个对象包含了完整的类的结构信息 这个Class对象就像一面镜子,透过这个镜子看到类的结构 那么,如何得到这个Class对象呢?以下可否 Class c = new Class(); 答案是不行的,因为Class的构造函数定义为私有

深入理解Java:类加载机制及反射

一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能. 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 2.工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示

通过反射了解集合泛型的本质

通过反射了解集合泛型的本质 import java.lang.reflect.Method; import java.util.ArrayList; /** * 通过反射了解集合泛型的本质 * @author shm * */ public class MethodDemo02 { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add("hello"); list.add(

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

java中的反射机制和javaBean

反射 反射:就是通过一个类加载进方法区时加载到栈内存中的Class字节码文件对这个类进行解剖 通过反射可以获取到一个类的构造方法,成员方法,成员变量 反射将一个类的各个部分映射成相应的类 反射获取构造方法 Class类中方法 Constructor<?>[] getConstructors() 返回当前字节码文件对象的所有public修饰的构造方法 Constructor<T> getConstructor(Class<?>...parameterTypes)返回指定了