Java/Android等效于Objective-C/iOS load()方法
对于iOS(在Objective-C中),每个类都有一个加载类时调用的Java/Android等效于Objective-C/iOS load()方法,android,ios,classloader,Android,Ios,Classloader,对于iOS(在Objective-C中),每个类都有一个加载类时调用的load()方法。当应用程序启动时,iOS似乎会加载所有类(或者至少加载定义了load()方法的所有类) 我在几个iOS程序中利用了这一点,向集中式消息处理程序注册了处理程序类,例如,它采用消息类型并使用处理程序类创建特定于每条消息的实例对象 为此使用load()可以让代码进行自动注册,而不必在某个地方列出所有类并手动调用它们——从某种意义上讲,它不太容易出错 下面是一些示例代码: 专用有效负载对象(更新有效负载类): 有效负
load()
方法。当应用程序启动时,iOS似乎会加载所有类(或者至少加载定义了load()
方法的所有类)
我在几个iOS程序中利用了这一点,向集中式消息处理程序注册了处理程序类,例如,它采用消息类型并使用处理程序类创建特定于每条消息的实例对象
为此使用load()
可以让代码进行自动注册,而不必在某个地方列出所有类并手动调用它们——从某种意义上讲,它不太容易出错
下面是一些示例代码:
专用有效负载对象(更新有效负载类):
有效负载消息处理程序
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中做一些类似的事情。是否有类似的方法是首选模型
编辑/后续:是否有一种使用反射来完成此任务的好方法?我知道Java中没有类似的
load()
,尽管您可以使用静态初始值设定项块来完成类似的任务。然而,类在首次使用之前不会加载到VM中。是的,这正是我所担心的——看起来我也回到了集中注册功能的阶段。它不像我说的那么讨厌,它更多的是在添加新东西时编辑多个文件。除了使用bruteforce风格的Class.forName(“com.foo.ClassName”)
之外,没有其他方法。另一种可能是使用Java的注释预处理器功能生成自动加载类的代码
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];
}