使用Runtime的objc_copyClassNamesForImage和objc_getClassList获取类
一、介绍
objc_copyClassNamesForImage:拷贝动态库类列表,也即当前工程下自己创建的所有类
objc_getClassList:获取所有类列表,也即当前工程下所有类(含系统类、cocoPods类)
二、代码
// NSBundle+XYQInfomation.m
// 运行时
#import "NSBundle+XYQInfomation.h"
#import <objc/runtime.h> #import <dlfcn.h> /// 动态链接库头文件
#import <mach-o/ldsyms.h> ///内核动态系统库头文件 @implementation NSBundle (XYQInfomation) ///获取当前工程下自己创建的所有类
+ (NSArray <Class> *)xyq_bundleOwnClassesInfo { NSMutableArray *resultArray = [NSMutableArray array]; unsigned int classCount;
const char **classes;
Dl_info info; ///_mh_execute_header : mach-o头部的地址
///dladdr: 获取app的路径
dladdr(&_mh_execute_header, &info); ///拷贝动态库类列表
classes = objc_copyClassNamesForImage(info.dli_fname, &classCount); dispatch_semaphore_t semaphore = dispatch_semaphore_create();///创建信号
dispatch_apply(classCount, dispatch_get_global_queue(, ), ^(size_t index) { ///遍历
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);///信号加锁
NSString *className = [NSString stringWithCString:classes[index] encoding:NSUTF8StringEncoding];
Class class = NSClassFromString(className);
[resultArray addObject:class];
dispatch_semaphore_signal(semaphore);///信号释放锁
}); ///释放内存
free(classes); return resultArray.mutableCopy;
} ///获取当前工程下所有类(含系统类、cocoPods类)
+ (NSArray <NSString *> *)xyq_bundleAllClassesInfo { NSMutableArray *resultArray = [NSMutableArray new]; ///获取所有类
int classCount = objc_getClassList(NULL, ); ///分配内存
Class *classes = NULL;
classes = (__unsafe_unretained Class *)malloc(sizeof(Class) *classCount); ///获取所有类
classCount = objc_getClassList(classes, classCount); dispatch_semaphore_t semaphore = dispatch_semaphore_create();///创建信号
dispatch_apply(classCount, dispatch_get_global_queue(, ), ^(size_t index) { ///遍历
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); ///信号加锁
Class class = classes[index];
NSString *className = [[NSString alloc] initWithUTF8String: class_getName(class)];
[resultArray addObject:className];
dispatch_semaphore_signal(semaphore);///信号释放锁
}); ///释放内存
free(classes); return resultArray.mutableCopy;
}
三、演示
测试:
-(void)test_Objc_GetClassList { //全部类
//NSArray *classes = [NSBundle xyq_bundleAllClassesInfo]; //自定义类
NSArray *classes = [NSBundle xyq_bundleOwnClassesInfo];
for (NSString *className in classes) {
NSLog(@"className = %@",className);
}
}
结果:
-- ::43.443258+ 运行时[:] className = Person
-- ::43.443411+ 运行时[:] className = TestObject
-- ::43.443514+ 运行时[:] className = ViewController
-- ::43.443599+ 运行时[:] className = DataTableViewController
-- ::43.443687+ 运行时[:] className = Student
-- ::43.443771+ 运行时[:] className = AppDelegate
-- ::43.443883+ 运行时[:] className = NoDataEmptyView
使用Runtime的objc_copyClassNamesForImage和objc_getClassList获取类的更多相关文章
- 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型
我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...
- Runtime获取类的属性列表和方法列表
Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...
- swift3.0 运行时获取类的属性
//定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Java 反射(二)运行时获取类的信息
目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...
- java获取类的信息
关键技术剖析 1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包. 2.Class类的forName方法能够根据类名加载类,获得类的Class对象. Cl ...
- PHP反射获取类中的所有常量
<?php// Yii 2// namespace yournamespace;// use Yii; /** * 缓存辅助类 */ class CacheHelper { /** * 缓存键 ...
- C#获取类以及类下的方法(用于Asp.Net MVC)
在C#中,实现动态获取类和方法主要通过反射来实现,要引用System.Reflection. public ActionResult GetControllerAndAction() List< ...
- c#通过反射获取类上的自定义特性
c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...
随机推荐
- tomcat启停脚本
脚本存放目录 /etc/init.d/ #!/bin/bash # description: Tomcat8 Start Stop Restart # processname: tomcat8 # c ...
- 017.Kubernetes二进制部署检查集群
一 验证集群功能 1.1 检查节点状态 [root@k8smaster01 ~]# kubectl get nodes 1.2 创建测试文件 [root@k8smaster01 ~]# cd /opt ...
- Iris入门操练1
选一个框架,慢慢熟悉··· 按官网文档,先走一次.. package main import ( "github.com/kataras/iris/v12" "githu ...
- JavaScript-----14.内置对象 Array()和String()
5. 数组对象 5.1数组的创建 之前提到过数组的创建方式 字面量 new Array() //创建数组的两种方式 //1.利用数组字面量 var arr = [1, 2, 3]; console.l ...
- asp开发类型判段
Asp的东西有许多,asp的类型便是其中之一,如同Asp的数据类型只需一个那便是"variant ". 它是一种特别的数据类型可以依据它的运用标明许多不同品种的信息(cnhfjj) ...
- redis缓存穿透,缓存击穿,缓存雪崩
概念解释 redis 缓存穿透 key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源.比如用一个不存在的用户id获取用户信息,不论缓存还是数据库 ...
- freemarker从入门到精通
目录 一:概述 二:Freemarker的Helloworld 三:freemarker模板语法 1.访问map中的key 2.访问POJO中的属性 3.取集合中的数据 4.判断 5.日期 6.Nul ...
- Kubernetes的CronJob对象
CronJob说白了就是用来管理Job对象的控制器, 通过jobTemplate管理Job对象,定时执行,最终实现我们的cron功能 示例 apiVersion: batch/v1beta1 kind ...
- dataTable 表插入新行
DataRow dr = dt.NewRow();//定义新行 dr["sumPrice"] = sumPrice;//对应字段赋值 d ...
- Cobalt Strike系列教程第三章:菜单栏与视图
通过前两章的学习,我们掌握了Cobalt Strike教程的基础知识,及软件的安装使用. Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...