NekiraReflectDynamic 主要提供动态反射的实现。
要想使用 NekiraReflectDynamic 库,需在 CMake 中进行如下配置:
target_link_libaries(Target PRIVATE NekiraReflectionLib::NekiraReflectDynamic)
target_include_directories(Target PRIVATE ${NekiraReflection_INCLUDE_DIRS})在项目中引入如下头文件,即可使用 NekiraReflectDynamic 库的功能
#include "NekiraReflect/DynamicReflect/Core/Core.hpp"NekiraReflectTool 会扫描头文件,为动态反射自动生成反射信息,详情见:NekiraReflectTool
反射宏,NekiraReflectTool 会识别这些宏并自动注册动态反射信息,它们分别对应于:class、struct、enum class、member function、member variable。
为了让动态反射得以注册Protected,Private部分的成员,需要在class,struct这些的定义里添加NEKIRA_REFLECT_BODY(ClasType)宏(这里的 ClassType 包含命名空间限定),并且在头文件添加对应的gen.hpp头文件。
当然如果不涉及到注册Protected,Private部分的成员,可以只提供反射宏,不需要添加NEKIRA_REFLECT_BODY(ClasType)宏以及相应的gen.hpp头文件。gen.hpp头文件是 NekiraReflectTool 生成的文件,它的命名参考被扫描的源头文件,即如果是 Test.h,则生成 Test.gen.hpp。
可以在gen.hpp还没生成的时候,在源头文件显式引用(这时会提示文件不存在,但是在编译流程该文件会被生成,之后才进入正常编译流程)
// Test.h
#include "NekiraReflect/DynamicReflect/Core/Core.hpp"
#include "Test.gen.hpp"
namespace Nekira::Test
{
class NCLASS() QualifiedClass
{
NEKIRA_REFLECT_BODY(Nekira::Test::QualifiedClass)
public:
NFUNCTION()
void Func() {}
private:
NPROPERTY()
std::string Arg;
};
enum class NENUM() QualifiedEnum
{
value1,
value2
}
} // namespace Nekira::Test
struct NSTRUCT() NormalStruct
{
NEKIRA_REFLECT_BODY(NormalStruct)
protected:
NPROPERTY()
float Data;
private:
void NonReflectFunc() {}
NFUNCTION()
void ReflectFunc() {}
};