对于 iOS(在 Objective-C 中),每个类都有一个load()
在加载类时调用的方法。load()
iOS 似乎在应用程序启动时加载了所有类(或至少所有定义了方法的类)。
我在几个 iOS 程序中利用了这一点,向集中式消息处理程序注册处理程序类,例如,它采用消息类型并使用处理程序类来创建特定于每条消息的实例对象。
使用load()
它允许代码进行自动注册,而不必在某处列出所有类并手动调用它们 - 从某种意义上说,它不太容易出错。
这是一些示例代码:
专门的有效载荷对象(更新有效载荷类):
@implementation
+(void)load
{
[Payload registerMessageName:@"Update"
forMessageKind:kPayloadUpdate
withPayloadHandler:[Update class]];
}
有效载荷消息处理程序
static NSMutableDictionary *s_payloadFactoryDict = nil;
static NSMutableDictionary *s_kindToNameMap = nil;
static NSMutableDictionary *s_nameToKindMap = nil;
@implementation
+(void)registerMessageName:(NSString *)messageName
forMessageKind:(PayloadKind)kind
withPayloadHandler:(Class)handlerClass
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
s_payloadFactoryDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
s_kindToNameMap = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
s_nameToKindMap = [[NSMutableDictionary alloc] initWithObjectsAndKeys:nil];
});
NSNumber *kindNum = [NSNumber numberWithInt:kind];
[s_nameToKindMap setObject:kindNum
forKey:messageName];
[s_kindToNameMap setObject:messageName
forKey:kindNum];
[s_payloadFactoryDict setObject:handlerClass
forKey:kindNum];
}
我现在想在 Android / Java 中做类似的事情。是否有类似的方法是首选模型?
编辑/跟进:有没有一种使用反射的好方法来做到这一点?