java私有方法_如何调用私有方法

当不涉及到用户隐私的时候,我们调用私有方法一般都没有什么问题。

在我们调用私有方法之前,我们必须要先知道你想调用的对象有哪些私有方法,和需要参数的那些方法的参数类型,和返回值的类型是多少。

查看私有方法名,参数类型和返回值类型

- (void)scanMethodsTwo:(Class)class {

unsigned int outCount = 0; // unsigned int :是无符号基本整型,没有负数

Method *methods = class_copyMethodList(class, &outCount); // 获取类的方法列表

for (int i = 0; i < outCount; i++) {

Method method = methods[i];

// 获取方法名

SEL sel = method_getName(methods[i]);

NSLog(@"方法名==== %@", NSStringFromSelector(sel));

// 获取参数

char argInfo[512] = {};

unsigned int argCount = method_getNumberOfArguments(method);

for (int j = 0; j < argCount; j++) {

// 参数类型

method_getArgumentType(method, j, argInfo, 512);

NSLog(@"参数类型=== %s", argInfo);

memset(argInfo, '\0', strlen(argInfo));

}

// 获取方法返回值类型

char retType[512] = {};

method_getReturnType(method, retType, 512);

NSLog(@"返回值类型=== %s", retType);

}

free(methods);

}

调用无参数方法

当知道方法名过后,我们调用没有参数的私有方法,有两种:

方法一:使用performSelector来调用

[button performSelector:@selector(updateConstraints)];

方法二:也可以使用objc_msgSend来调用,但是是有这个必须要导入#import ,#import 这两个头文件。

((void(*)(id,SEL))objc_msgSend)(button, @selector(updateConstraints));

如果要使用下面这种写法,必须要在项目配置文件 -> Build Settings -> Enable Strict Checking of objc_msgSend Calls 这个字段设置为 NO, 默认为YES.

objc_msgSend(button, @selector(updateConstraints));

调用有参数方法

要使用objc_msgSend来调用,并传递参数

((void(*)(id,SEL, CGRect))objc_msgSend)(button, @selector(setFrame:), CGRectMake(200, 100, 50, 50));

objc_msgSend(button, @selector(setFrame:), CGRectMake(200, 100, 50, 50));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值