package com.czg.config;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.registry.Registry;
import org.apache.dubbo.registry.nacos.NacosNamingServiceWrapper;
import org.apache.dubbo.registry.nacos.NacosRegistry;
import org.apache.dubbo.registry.nacos.NacosRegistryFactory;

import java.lang.reflect.Field;

/**
 * @author yjjie
 * @date 2025/12/19 17:31
 */
public class FilteredNacosRegistryFactory extends NacosRegistryFactory {


    @Override
    public Registry createRegistry(URL url) {
        // 1. 先创建 Dubbo 原生的 NacosRegistry 实例
        NacosRegistry originalNacosRegistry = (NacosRegistry) super.createRegistry(url);

        try {
            // 2. 反射提取 NacosRegistry 中的 NacosNamingServiceWrapper 实例（Dubbo 3.3 私有字段名：namingService）
            Field namingServiceField = NacosRegistry.class.getDeclaredField("namingService");
            // 突破私有访问限制
            namingServiceField.setAccessible(true);
            NacosNamingServiceWrapper namingServiceWrapper = (NacosNamingServiceWrapper) namingServiceField.get(originalNacosRegistry);

            // 3. 创建自定义的 FilteredNacosRegistry（传入URL + 提取的 namingServiceWrapper）
            return new FilteredNacosRegistry(url, namingServiceWrapper);

        } catch (NoSuchFieldException | IllegalAccessException e) {
            // 兼容字段名差异（若字段名不是 namingService，尝试其他可能：nacosNamingService）
            try {
                Field fallbackField = NacosRegistry.class.getDeclaredField("nacosNamingService");
                fallbackField.setAccessible(true);
                NacosNamingServiceWrapper namingServiceWrapper = (NacosNamingServiceWrapper) fallbackField.get(originalNacosRegistry);
                return new FilteredNacosRegistry(url, namingServiceWrapper);
            } catch (Exception ex) {
                throw new RuntimeException("获取 NacosNamingServiceWrapper 失败", ex);
            }
        }
    }
}