【Object C】 反射机制

Object-C 也提供了类似Java的反射机制。通过以下三种方式与运行环境交互:

1、直接通过Object-C源代码

2、通过NSObject中定义的方法:

isKindOfClass

isMemberOfClass

responseToSelector:判断该实例是否调用指定方法

3、直接调用运行时函数进行动态编程

#import
<Foundation/Foundation.h>

#import
"DCApple.h"

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

@autoreleasepool {

// insert code here...

NSLog(@"Hello, World!");

//
通过字符串来获取Class

Class clazz =
NSClassFromString(@"NSDate");

NSLog(@"%@"
, clazz);

//
直接使用Class来创建对象

id date = [[clazz
alloc]
init];

NSLog(@"%@"
, date);

//
通过对象来获取Class

NSLog(@"%@"
, [date
class]);

//
通过类来获取class

NSLog(@"%d"
, clazz ==
NSDate.class);

}

return
0;

}

===>>

2014-12-01 09:06:25.916 reflection[1179:303] Hello, World!

2014-12-01 09:06:25.917 reflection[1179:303] NSDate

2014-12-01 09:06:25.924 reflection[1179:303] 2014-12-01 01:06:25 +0000

2014-12-01 09:06:25.925 reflection[1179:303] __NSDate

2014-12-01 09:06:25.925 reflection[1179:303] 1

Program ended with exit code: 0

检查继承关系

conformsToProtocol:传入一个Protocol 参数,用于判断该类及其子类的实例。

//

//  main.m

//  reflection

//

//  Created by mac on 14-12-1.

//  Copyright (c) 2014年
mac. All rights reserved.

//

#import
<Foundation/Foundation.h>

#import
"DCApple.h"

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

@autoreleasepool {

//
判断对象是否为某个类及其子类的实例

NSLog(@"app是否为DCApple及其子类的实例:%d",

[app
isKindOfClass:
DCApple.class]);

NSLog(@"app是否为NSObject及其子类的实例:%d",

[app
isKindOfClass:
NSObject.class]);

NSLog(@"app2是否为DCApple及其子类的实例:%d",

[app2
isKindOfClass:
DCApple.class]);

NSLog(@"app2是否为NSObject及其子类的实例:%d",

[app2
isKindOfClass:
NSObject.class]);

//
判断对象是否实现了指定协议

NSLog(@"app是否实现DCEatable协议:%d",

[app
conformsToProtocol:
@protocol(DCEatable)]);

NSLog(@"app2是否实现了DCEatable协议:%d",[app2
conformsToProtocol:
@protocol(DCEatable)]);

}

return
0;

}

=====>>

2014-12-01 14:07:26.220 reflection[2195:303] DCApple

2014-12-01 14:07:26.220 reflection[2195:303] DCApple1

2014-12-01 14:07:26.221 reflection[2195:303] app是否为DCApple的实例:1

2014-12-01 14:07:26.221 reflection[2195:303] app是否为NSObject的实例:0

2014-12-01 14:07:26.222 reflection[2195:303] app2是否为NSObject的实例:0

2014-12-01 14:07:26.222 reflection[2195:303] app2是否为DCApple的实例:0

2014-12-01 14:07:26.223 reflection[2195:303] app2是否为DCApple的实例:1

2014-12-01 14:07:26.223 reflection[2195:303] app是否为DCApple及其子类的实例:1

2014-12-01 14:07:26.224 reflection[2195:303] app是否为NSObject及其子类的实例:1

2014-12-01 14:07:26.224 reflection[2195:303] app2是否为DCApple及其子类的实例:1

2014-12-01 14:07:26.225 reflection[2195:303] app2是否为NSObject及其子类的实例:1

2014-12-01 14:07:26.225 reflection[2195:303] app是否实现DCEatable协议:1

2014-12-01 14:07:26.225 reflection[2195:303] app2是否实现了DCEatable协议:1

Program ended with exit code: 0

时间: 2024-11-08 21:33:40

【Object C】 反射机制的相关文章

Java中反射机制(Reflection)研究及源码演示

如下内容内容是关于 Java中反射机制(Reflection)研究及演示的内容. package com.jiangqq.reflection; import java.lang.reflect.Method; public class Reflection1 { public static void main(String[] args) throws Exception { Class<?> tClass = Class.forName("java.lang.Class"

java反射机制reflect 分析Object对象

直接看一个实例吧 </pre><pre name="code" class="java">package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; class Behavior { privat

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl

Java反射机制

Java的反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 反射的作用 1 可以反编译将class文件编译成java文件 2 可以通过反射机制访问Java对象的属性,方法,构造方法等 反射机制使用步骤 1 得到要调用类的class 2 通过得到的c

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

Java 反射机制

使用 Java 反射机制可以在运行时期检查 Java 类的信息,检查 Java 类的信息往往是你在使用 Java 反射机制的时候所做的第一件事情,通过获取类的信息你可以获取以下相关的内容: Class 对象 类名 修饰符 包信息 父类 实现的接口 构造器 方法 变量 注解 除了上述这些内容,还有很多的信息你可以通过反射机制获得,如果你想要知道全部的信息你可以查看相应的文档 JavaDoc for java.lang.Class 里面有详尽的描述. 在本节中我们会简短的涉及上述所提及的信息,上述的

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i

java学习——反射机制

/* * JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法: * 对于任意一个对象,都能够调用它的任意一个方法和属性: * 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. * * 动态获取类中信息,就是java反射 . * 可以理解为对类的解剖. * * 要想要对字节码文件进行解剖,必须要有字节码文件对象. * 如何获取字节码文件对象呢? * */ 1. 通过Class clazz =Class.forName()找

Java再学习-反射机制

首先说到反射,大家肯定不会陌生,如果不知道反射,相信那些市面上常用的主流框架就不会出现了.废话不说,上主题! Java反射机制 运行时 判断任意一个对象所属的类 构造任意一个类的对象 判断任意一个类所具有的成员变量和方法 调用一个对象的方法 注意点:运行时,而不是编译时 首先概念性的东西,小编就不细说了,想了解的直接问度娘吧,直接上干货吧. 通过反射来进行方法调用的具体步骤: 1.首先要获取Class对象(手段比较多,例如通过forname手段和InvokeTester.class手段) 2.如