1. // 从配置文件中加载所有的拓展类,可得到“配置项名称”到“配置类”的映射关系表
    2. Class<?> clazz = getExtensionClasses().get(name);
    3. if (clazz == null) {
    4. throw findException(name);
    5. }
    6. try {
    7. T instance = (T) EXTENSION_INSTANCES.get(clazz);
    8. if (instance == null) {
    9. // 通过反射创建实例
    10. instance = (T) EXTENSION_INSTANCES.get(clazz);
    11. }
    12. // 向实例中注入依赖
    13. injectExtension(instance);
    14. Set<Class<?>> wrapperClasses = cachedWrapperClasses;
    15. if (wrapperClasses != null && !wrapperClasses.isEmpty()) {
    16. // 循环创建 Wrapper 实例
    17. for (Class<?> wrapperClass : wrapperClasses) {
    18. // 将当前 instance 作为参数传给 Wrapper 的构造方法,并通过反射创建 Wrapper 实例。
    19. (T) wrapperClass.getConstructor(type).newInstance(instance));
    20. }
    21. }
    22. return instance;
    23. } catch (Throwable t) {
    24. throw new IllegalStateException("...");
    25. }
    26. }
    1. 通过 getExtensionClasses 获取所有的拓展类
    2. 通过反射创建拓展对象
    3. 将拓展对象包裹在相应的 Wrapper 对象中