Если программный код не удален, вы можете получить некоторый анализ, прочитав двоичный файл: objdump -demangle=C++ -t SomeQtLibrary.so |grep qt_static_metacall
он показывает примерно производные классы QObject.Я думаю, что все они реализуют этот символ.Конечно, поскольку вы работаете в Windows, вам придется использовать инструменты Windows, такие как nm
(поправьте меня, если я ошибаюсь).Естественно, обработка символов в коде также возможна, но это отдельная тема.
Упомянутая мною команда возвращает это, например:
0000000000470c00 l F .text 0000000000000014 QxtBoundFunction::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
00000000004392ea l F .text 0000000000000158 MainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000453b5c l F .text 0000000000000091 QtLocalPeer::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000438508 l F .text 0000000000000014 MyApplication::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000442cd0 l F .text 0000000000000080 MessagePoll::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000442ea2 l F .text 0000000000000091 RFBClient::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000467c3c l F .text 000000000000436a QxtRPCService::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
0000000000439114 l F .text 000000000000008f MemoryPolling::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)
Если вас интересует самоанализ во время выполнения, вам придется играть с классом QMetaObject накаждый объект.
Для объектов, которые были зарегистрированы как QMetaType (и только те!), вы можете применить дополнительную магию, чтобы оживить их.Не очень легко, и не из коробки - но это все еще чертовски много от такого статичного языка.Вот фрагмент из документации Qt (изменен if(id == 0)
на if(id)
).
int id = QMetaType::type("MyClass");
if (id) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}