qt本身就帶有強大的反射功能,如果想通過函式名稱字串呼叫函式,需要在被呼叫的函式前新增巨集:
q_invokable
定義乙個基類:
#pragma once
#include class qtinvoke : public qobject ;
#include "qtinvoke.h"
#include qtinvoke::qtinvoke(qobject *parent)
: qobject(parent)
qtinvoke::~qtinvoke()
q_invokable void qtinvoke::test()
q_invokable int qtinvoke::testadd(int a, int b)
定義子類:
#pragma once
#include "qtinvoke.h"
class qtinvokea :public qtinvoke ;
#include "qtinvokea.h"
#include qtinvokea::qtinvokea():qtinvoke(nullptr)
qtinvokea::~qtinvokea()
q_invokable void qtinvokea::test()
q_invokable int qtinvokea::testadd(int a, int b)
呼叫:
qtinvoke* inv = new qtinvokea;
qdebug() << qmetaobject::invokemethod(inv, "test");
int retval = 0;
qdebug() << qmetaobject::invokemethod(inv
, "testadd"
,q_return_arg(int, retval)
,q_arg(int, 65)
,q_arg(int, 42));
qdebug() << retval;
輸出:
利用反射機制呼叫私有方法
步驟1 獲取到當前執行緒的類載入器 classloader classloader thread.currentthread getcontextclassloader 步驟2 用類載入器獲取的class物件 class clazz classloader.loadclass com.wxw.tes...
利用反射機制實現工廠模式
細節 命名規則類,介面名稱都得大寫 寫完 記得格式化,就算是測試 貼出來也是給人看的。不能太水。inte ce fruit public void eat class orange implements fruit class factory catch exception e return f c...
反射機制 呼叫方法
通過反射機制,呼叫乙個物件的方法 獲取成員方法 public method getmethod string name,class.parametertypes 獲取單個公共成員方法 public method getdeclaredmethod string name,class.paramete...