Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java/Android等效于Objective-C/iOS load()方法_Android_Ios_Classloader - Fatal编程技术网

Java/Android等效于Objective-C/iOS load()方法

Java/Android等效于Objective-C/iOS load()方法,android,ios,classloader,Android,Ios,Classloader,对于iOS(在Objective-C中),每个类都有一个加载类时调用的load()方法。当应用程序启动时,iOS似乎会加载所有类(或者至少加载定义了load()方法的所有类) 我在几个iOS程序中利用了这一点,向集中式消息处理程序注册了处理程序类,例如,它采用消息类型并使用处理程序类创建特定于每条消息的实例对象 为此使用load()可以让代码进行自动注册,而不必在某个地方列出所有类并手动调用它们——从某种意义上讲,它不太容易出错 下面是一些示例代码: 专用有效负载对象(更新有效负载类): 有效负

对于iOS(在Objective-C中),每个类都有一个加载类时调用的
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];
}