json generic invoke

support generic invoke of json string parameters

A new method is provided for Dubbo generic invoke: directly passing on String to complete an invoke. In other words, users can directly pass on parameter object’s json String to complete a generic invoke.

Using generic invoke through API method

For the following providers:

public User setUser(User user) {
        return user;
    }
@Data
public class User {
    String name;
    int age;
}

do one generic invoke:

public class GenericInvoke {
    public static void main(String[] args) {
        ApplicationConfig app = new ApplicationConfig("ConsumerTest");
        RegistryConfig reg = new RegistryConfig("nacos://localhost:8848");
        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
        bootstrap.application(app);
        bootstrap.registry(reg);
        bootstrap.start();
            try {
                // config remote service
                ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
                // name of the weakly typed interface    
                reference.setInterface("com.xxx.api.service.TestService");
                reference.setGroup("dev");
                reference.setVersion("1.0");
                reference.setRetries(0);
                // set generic=gson in RpcContext
                RpcContext.getContext().setAttachment("generic","gson");
                // declare the interface to be generic
                reference.setGeneric(true);
                reference.setCheck(false);
                GenericService genericService = ReferenceConfigCache.getCache().get(reference);
                // pass on parameter object's json String for an invoke
                Object res = genericService.$invoke("setUser", new String[]{"com.xxx.api.service.User"}, new Object[]{"{'name':'Tom','age':24}"});
                System.out.println("result[setUser]:"+res); // response output:result[setUser]:{name=Tom, class=com.xxx.api.service.User, age=24}
            } catch (Throwable ex) {
                ex.printStackTrace();
            }
    }
}