1

对于 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 中做类似的事情。是否有类似的方法是首选模型?

编辑/跟进:有没有一种使用反射的好方法来做到这一点?

4

1 回答 1

1

实现你想要的东西的方法很少。

  1. 在要“注册”的类中使用静态块。这很简单,而且很容易。主要缺点是,您无法跟踪所有类,但您“注释”的类
class LoadedClassHandler {
    static void handleLoadedClass(Class<?> cls) {
        // whatever you want to do with that information
    }
}

[....]

class Example {
    static {
       LoadedClassHandler.handleLoadedClass(Example.class);
    }
}
  1. 创建一个自定义类加载器,并通过覆盖的 findClass() 在其中注册加载的类。

更多关于这里如何使用自定义 ClassLoader?

这是一种相当困难的方法,但在大多数情况下,它会完成您想要实现的目标,即:有一种通用的方法来跟踪加载的类

记住几件事

  • 注册只会发生一次(如果你做对了)
  • 资源也通过相同的类加载器加载。
  • LoadedClassHandler是您自己创建的课程 =)

祝你好运!

于 2021-07-16T18:02:14.227 回答