利用QObject反射实现jsonrpc

1.jsonrpc请求中的params数组生成签名

   static QString signatureFromJsonArray(const QJsonArray &array)
    {
        QStringList list;
        foreach(const QJsonValue &v, array)
        {
            list<<JSTypeToString(v.type());
        }
        return list.join(",");
    }

2.QObject对象内的方法生成签名

static QString signatureFromMethod(const QMetaMethod &method)
    {
        QStringList list;
        for(int i=0; i<method.parameterCount(); i++)
        {
            int type = method.parameterType(i);
            list<<JSTypeToString(convertVariantTypeToJSType(type));
        }
        return list.join(",");
    }

3.查找QObject实例中的签名(略),相同则调用

    static QVariantList createParameterVariantList(const QMetaMethod &method, const QJsonArray &array)
    {
        QVariantList varList;
        for(int i=0; i<method.parameterCount(); i++)
        {
            int type = method.parameterType(i);
            QVariant v= convertJSValueToVariant(type, array.at(i));
            varList.append(v);
        }
        return varList;
    }

    static QVariant invoke(QObject* object, const QMetaMethod &method, const QJsonArray &params)
    {
        QVarLengthArray<void *, 10> invokeParams;
        //压入返回值,参数
        int returnType = method.returnType();
        if (returnType==QMetaType::Void)
        {
            returnType = QMetaType::UnknownType;
        }
        QVariant returnValue(returnType, nullptr);
        invokeParams.append(returnValue.data());
        //压入参数
        QVariantList varList = createParameterVariantList(method, params);
        foreach(const QVariant &v, varList)
        {
            invokeParams.append(const_cast<void *>(v.constData()));
        }
        //调用
        object->qt_metacall(QMetaObject::InvokeMetaMethod, method.methodIndex(), invokeParams.data());
        return returnValue;
    }

关键代码行:object->qt_metacall(QMetaObject::InvokeMetaMethod, method.methodIndex(), invokeParams.data());

时间: 2024-08-03 05:52:14

利用QObject反射实现jsonrpc的相关文章

利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 package com.banksteel.util; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.ut

利用Java反射机制和泛型,全自动解析json

有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去执行这个方法 m1 = cls.getDeclaredMethod(getMothodName(fields[j].getName()), String.class); m1.invoke(result,json.getString(fields[j].getName()) ); 利用泛型 去获取这

利用Java反射机制完成XML到对象的解析

对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hashtable,那就能大大加快访问的速度. 由于工作的需要,写了一个解析工具,将XML解析成相应的对象列表.以下是源代码,希望对大家有所帮助,更希望大家帮我来改进这个工具. package com.sp.util; /* * author:hingwu * email:[email protected]

利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换

作者:54dabang 在spring的学习过程之中,我们可以看出通过配置文件来动态管理bean对象的好处(松耦合 可以让零散部分组成一个整体,而这些整体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非逻辑,有了IOC之后,我们可以让SPRING充当各框架中的整合器,把技术框架进行完美的结合). Spring实现的一个重要的机制是通过反射(java.lang.reflect)读取配置文件,通过配置文件来动态生成配置文件中的类对象.Java动态加载类主要是为了不改变主程序代码,通过修

利用C# 反射设计支持可扩展插件的应用程序

  1.设计接口类: public interface IBase { void Somefun(); } 2.设计扩展插件类: class PluginCls:IBase { public void Somefun() { Console.WriteLine("hello ,i am derived class"); } } 3.主程序设计: class Program { static void Main(string[] args) { Assembly asm = Assemb

利用java反射机制实现读取excel表格中的数据

如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.List<Book>等,所以需要使用泛型机制去实现.下面会给出代码,可能会稍微复杂一点,但注释很清晰,希望大家耐心阅读. 在上代码之前简单说一下思路: 1.excel表格必须有表头,且表头中各列的值要与实体类的属性相同: 2.先读取表头信息,然后获取表头列数,接着确定需要使用的set方法的名称,并存到数

利用java 反射机制来实现一个servlet处理多种请求

如果我们想在一个servlet中处理多种请求(比如新闻的添加.删除),简单的可以在jsp提交表单的action路径中添加一个键值对,然后再servlet中接收后根据不同的值来调用不同的方法. jsp端 1 <form action="newsServlet?method=add" method="post"> 2 <input type="text" ..> 3 <input type="submit&qu

Android自定义工具类获取按钮并绑定事件(利用暴力反射和注解)

Android中为按钮绑定事件的有几种常见方式,你可以在布局文件中为按钮设置id,然后在MainActivity中通过findViewById方法获取按钮对象实例,再通过setOnClickListener为按钮绑定事件,如下所示: //1.获取控件 btn = (Button)findViewById(R.id.button1); //2.绑定事件 btn.setOnClickListener(new OnClickListener() { @Override public void onCl

Android:利用Java反射调用@hide的API

置使用3G数据功能: 从源代码看到隐藏的API(ConnectivityManager.java): 查看文本打印? /** * Sets the persisted value for enabling/disabling Mobile data. * * @param enabled Whether the mobile data connection should be *            used or not. * @hide */ public void setMobileDa