class ProxyBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor,
                                          PriorityOrdered {

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
                                                                                  throws BeansException {<FILL_FUNCTION_BODY>}

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
                                                                                   throws BeansException {

    }

    @Override
    public int getOrder() {
        return PriorityOrdered.HIGHEST_PRECEDENCE;
    }
}

        boolean updateProxyBean = false;
        for (String beanName : registry.getBeanDefinitionNames()) {
            String transformedBeanName = BeanFactoryUtils.transformedBeanName(beanName);
            if (registry.containsBeanDefinition(transformedBeanName)) {
                BeanDefinition beanDefinition = registry.getBeanDefinition(transformedBeanName);
                if (ProxyFactoryBean.class.getName().equals(beanDefinition.getBeanClassName())) {
                    beanDefinition.setBeanClassName(SofaProxyFactoryBean.class.getName());
                    Object proxyInterfaces = beanDefinition.getPropertyValues().get(
                        "proxyInterfaces");
                    if (proxyInterfaces == null) {
                        proxyInterfaces = beanDefinition.getPropertyValues().get("interfaces");
                    }
                    beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0,
                        proxyInterfaces);
                    beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(1,
                        beanDefinition.getPropertyValues().get("targetName"));
                    beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(2,
                        beanDefinition.getPropertyValues().get("targetClass"));
                    // must be true
                    if (registry instanceof ConfigurableListableBeanFactory) {
                        beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(3,
                            registry);
                    }
                    updateProxyBean = true;
                }
            }
        }
        if (updateProxyBean && registry instanceof ConfigurableListableBeanFactory) {
            // must clear metadata cache
            ((ConfigurableListableBeanFactory) registry).clearMetadataCache();
        }
    
<no_super_class>