Runtime获取类的属性列表和方法列表

Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_megsend(),甚至可以在运行时动态的为一个类去添加属性和方法,此篇博客要学习的是两个知识点:

  • 获取对象的所有属性 
  • 获取对象的所有方法

为了方便,我们可以在项目中为NSObject添加一个category,增加下面两个方法,这样我们就可以轻轻松松获得每个类的所以方法和所以属性了,记得导入runtime的头文件哦。

获取对象的所有属性、方法、属性和属性内容

NSObject+JGRuntime.h文件

#import <Foundation/Foundation.h>

@interface NSObject (JGRuntime)

/* 获取对象的所有属性 */
+(NSArray *)getAllProperties; /* 获取对象的所有方法 */
+(NSArray *)getAllMethods; /* 获取对象的所有属性和属性内容 */
+ (NSDictionary *)getAllPropertiesAndVaules; @end

NSObject+JGRuntime.m文件

#import "NSObject+JGRuntime.h"
#import <objc/runtime.h> @implementation NSObject (JGRuntime) /* 获取对象的所有属性 */
+(NSArray *)getAllProperties
{
u_int count;
// 传递count的地址过去 &count
objc_property_t *properties =class_copyPropertyList([self class], &count);
//arrayWithCapacity的效率稍微高那么一丢丢
NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count]; for (int i = 0; i < count ; i++)
{
//此刻得到的propertyName为c语言的字符串
const char* propertyName =property_getName(properties[i]);
//此步骤把c语言的字符串转换为OC的NSString
[propertiesArray addObject: [NSString stringWithUTF8String: propertyName]];
}
//class_copyPropertyList底层为C语言,所以我们一定要记得释放properties
// You must free the array with free().
free(properties); return propertiesArray;
} /* 获取对象的所有方法 */
+(NSArray *)getAllMethods
{
unsigned int methodCount =0;
Method* methodList = class_copyMethodList([self class],&methodCount);
NSMutableArray *methodsArray = [NSMutableArray arrayWithCapacity:methodCount]; for(int i=0;i<methodCount;i++)
{
Method temp = methodList[i];
IMP imp = method_getImplementation(temp);
SEL name_f = method_getName(temp);
const char* name_s =sel_getName(method_getName(temp));
int arguments = method_getNumberOfArguments(temp);
const char* encoding =method_getTypeEncoding(temp);
NSLog(@"方法名:%@,参数个数:%d,编码方式:%@",[NSString stringWithUTF8String:name_s],
arguments,
[NSString stringWithUTF8String:encoding]);
[methodsArray addObject:[NSString stringWithUTF8String:name_s]];
}
free(methodList);
return methodsArray;
} /* 获取对象的所有属性和属性内容 */
+ (NSDictionary *)getAllPropertiesAndVaules
{
NSMutableDictionary *propsDic = [NSMutableDictionary dictionary];
unsigned int outCount;
objc_property_t *properties =class_copyPropertyList([self class], &outCount);
for ( int i = 0; i<outCount; i++)
{
objc_property_t property = properties[i];
const char* char_f =property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:char_f];
id propertyValue = [self valueForKey:(NSString *)propertyName];
if (propertyValue) {
[propsDic setObject:propertyValue forKey:propertyName];
}
}
free(properties);
return propsDic;
} @end

调用时:

包含头文件

#import "NSObject+JGRuntime.h"

直接调用

如我在一个控制器的导航栏按钮点击时调用时

JGLog(@"\n%@",[JGWorkLogViewController getAllMethods]);

打印结果是:

(

setupChildVces,

setupTitlesView,

setupContentView,

titleClick:,

setTitlesView:,

setIndicatorView:,

setSelectedButton:,

indicatorView,

selectedButton,

titlesView,

setNavItem,

rightItemBtnClick,

leftitemBtnClick,

loadCtrlWithLogTypeStr:,

setContentView:,

scrollViewDidEndDecelerating:,

scrollViewDidEndScrollingAnimation:,

didReceiveMemoryWarning,

viewDidLoad,

.cxx_destruct,

contentView,

)

Runtime获取类的属性列表和方法列表的更多相关文章

  1. 反射,获取类的属性以及get方法

    vo实体类: public class Result { /*** * 返回结果code * ok:10000 * error:20000 */ private String code; /*** * ...

  2. 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

    我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...

  3. Java反射学习-1 - 反射获取类的属性,方法,构造器

    新建一个Person类 package cn.tx.reflect; /** * 注解初步了解 * @author Administrator * */ public class Person { p ...

  4. Python基础:面向对象基础 (一) 类及其属性和魔法方法

    定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表 # 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Her ...

  5. java利用反射获取类的属性及类型

    java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...

  6. C#获取当前堆栈的各调用方法列表

    在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用 ...

  7. 如何获取类或属性的自定义特性(Attribute)

    如何获取类或属性的自定义特性(Attribute) 问题说明: 在ActiveRecord或者其他的ORM等代码中, 我们经常可以看到自定义特性(Attribute)的存在(如下面的代码所示) [Pr ...

  8. .NET C#利用反射获取类文件以及其中的方法&属性 并获取类及方法上的特性

    了解C#特性类并声明我们自己的特性类[AttributeTest]代码如下 using System; namespace AttributeTest { /* 特性说明 特性本质是一个继承和使用了系 ...

  9. swift3.0 运行时获取类的属性

    //定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...

随机推荐

  1. Python 实例2—购物车

    老男孩教学学习笔记 """启动程序后,让用户输入工资,然后打印商品列表允许用户根据商品编号购买商品用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒可随机退出,退出 ...

  2. oracle 分区表详解

    一.分区表的概述: Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任 ...

  3. 20145329吉东云 《Java程序设计》 第一周学习总结

    一.JAVA平台概述 1.Java诞生于1995年5月23日,java体系架构分为JavaSE.JavaME.JavaEE三大平台,本章重点介绍了JavaSE.JavaSE分为四个主要部分:JVM.J ...

  4. Commons Configuration之一简介

    转载自(https://my.oschina.net/u/2000201/blog/486327) 1    简介 Commons Configuration软件类库提供通用配置接口,使Java应用程 ...

  5. Nodejs V8引擎 fast property lookup

    前言 之所以会研究这个东西,是我在网上找了一下各个语言的执行效率比较.好吧,我承认这是个无聊的东西,不过看看总是无妨,然而我惊讶的发现,有些测试声称Java,C,Nodejs是处在同一个效率级别参见链 ...

  6. 2017 ACM/ICPC Asia Regional Shenyang Online array array array

    2017-09-15 21:05:41 writer:pprp 给出一个序列问能否去掉k的数之后使得整个序列不是递增也不是递减的 先求出LIS,然后倒序求出最长递减子序列长度,然后判断去k的数后长度是 ...

  7. 组合数模板 - Lucas

    2017-08-10 19:35:32 整理者:pprp 用于计算C(m,n) % p 代码如下: //lucas #include <iostream> using namespace ...

  8. linux一键安装nginx脚本

    #!/bin/sh echo "----------------------------------start install nginx ------------------------- ...

  9. IE与DOM的事件监听

    IE 事件监听 标准DOM不支持   注意几点: window.onload attachEvent detachEvent 标准DOM监听,ie不支持

  10. 公众号菜单中的click

    $params = [ 'button' => [ [ 'type'=>'click', 'name'=>'就送帽子', 'key'=>'V1001_PRESENT', ], ...