反射
最近更新时间:2023-09-05
反射标记宏头文件
public/macros_reflection.h
需要生成反射信息的类型需要包含该头文件。该头文件定义了反射生成阶段用到的宏。
reflection_test_define.h
#ifndef _REFLECTION_TEST_DEFINE_H
#define _REFLECTION_TEST_DEFINE_H
#include "../public/i_entity.h"
#include "../public/i_interface.h"
#include "../utils/pod_traits.h"
#include "../public/macros_reflection.h"
typedef int int8;
namespace flexi
{
enum EnumTest
{
A,
B,
C,
D,
E,
F,
G,
}FX_ENUM();
}
反射标记宏
接口类型反射标记宏
接口类型如果需要支持反射,需要在定义后标记FX_INTERFACE ()。
relection_test_define.h
FX_PROPERTY()
float y;
}FX_CLASS();
class TestInterface : public IInterface
{
public:
virtual bool Init() override
{
return true;
}
virtual bool Shut() override
{
return true;
}
}FX_INTERFACE();
实体型反射标记宏
实体类型如果需要支持反射,需要在定义后标记FX_ENTITY()。
relection_test_define.h
}
}FX_INTERFACE();
class TestEntity : public IEntity
{
public:
virtual bool Init(const IVarList& args) override
{
return true;
}
virtual bool Shut() override
{
return true;
}
FX_METHOD()
float TestMethod(FX_META(Type=double) float x, float y)
{
return x + y;
}
}FX_ENTITY();
支持的Meta:
- Parent=MyBaseEntity(键值对)
说明:可选,指定MyBaseEntity为其父反射类型。
(1)scene_trace_adapter.h
class TraceQueryFilter;
class SceneTraceAdapter : public ITraceAdapter
{
public:
SceneTraceAdapter();
~SceneTraceAdapter();
virtual bool Init(const IVarList& args) override;
virtual bool Shut() override;
virtual void SetAdapteeID(const PERSISTID& adaptee_id) override;
virtual bool TraceDetail(CXMVECTOR src, CXMVECTOR dir,
dx_trace_info_t& result) override;
virtual bool TraceHitted(CXMVECTOR src, CXMVECTOR dir) override;
virtual bool TraceSphere(CXMVECTOR center, float radius) override;
FX_METHOD()
void SetTraceMask(const char* type, bool mask);
private:
LScene* m_pScene;
TraceQueryFilter* m_pFilter;
}FX_ENTITY();
#endif // _SCENE_TRACE_ADAPTER_H
scene_trace_adapter_gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
#define REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
DECLARE_ENTITY("", SceneTraceAdapter, ITraceAdapter)
DECLARE_METHOD_VOID_2(SceneTraceAdapter, SetTraceMask, const char *, bool)
#endif //REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
(2)scene_trace_adapter.h
class TraceQueryFilter;
class SceneTraceAdapter : public ITraceAdapter
{
public:
SceneTraceAdapter();
~SceneTraceAdapter();
virtual bool Init(const IVarList& args) override;
virtual bool Shut() override;
virtual void SetAdapteeID(const PERSISTID& adaptee_id) override;
virtual bool TraceDetail(CXMVECTOR src, CXMVECTOR dir,
dx_trace_info_t& result) override;
virtual bool TraceHitted(CXMVECTOR src, CXMVECTOR dir) override;
virtual bool TraceSphere(CXMVECTOR center, float radius) override;
FX_METHOD()
void SetTraceMask(const char* type, bool mask);
private:
LScene* m_pScene;
TraceQueryFilter* m_pFilter;
}FX ENTITY(Parent=IEntify);
scene_trace_adapter_gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
#define REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
DECLARE_ENTITY("", SceneTraceAdapter, IEntify)
DECLARE_METHOD_VOID_2(SceneTraceAdapter, SetTraceMask, const char *, bool)
#endif //REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
- IsAbstract(键)
说明:可选,是否抽象类型。
(1)scene_trace_adapter.h
class TraceQueryFilter;
class SceneTraceAdapter : public ITraceAdapter
{
public:
SceneTraceAdapter();
~SceneTraceAdapter();
virtual bool Init(const IVarList& args) override;
virtual bool Shut() override;
virtual void SetAdapteeID(const PERSISTID& adaptee_id) override;
virtual bool TraceDetail(CXMVECTOR src, CXMVECTOR dir,
dx_trace_info_t& result) override;
virtual bool TraceHitted(CXMVECTOR src, CXMVECTOR dir) override;
virtual bool TraceSphere(CXMVECTOR center, float radius) override;
FX_METHOD()
void SetTraceMask(const char* type, bool mask);
private:
LScene* m_pScene;
TraceQueryFilter* m_pFilter;
}FX_ENTITY();
scene_trace_adapter_gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
#define REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
DECLARE_ENTITY("", SceneTraceAdapter, ITraceAdapter)
DECLARE_METHOD_VOID_2(SceneTraceAdapter, SetTraceMask, const char *, bool)
#endif //REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
(2)scene_trace_adapter.h
class TraceQueryFilter;
class SceneTraceAdapter : public ITraceAdapter
{
public:
SceneTraceAdapter();
~SceneTraceAdapter();
virtual bool Init(const IVarList& args) override;
virtual bool Shut() override;
virtual void SetAdapteeID(const PERSISTID& adaptee_id) override;
virtual bool TraceDetail(CXMVECTOR src, CXMVECTOR dir,
dx_trace_info_t& result) override;
virtual bool TraceHitted(CXMVECTOR src, CXMVECTOR dir) override;
virtual bool TraceSphere(CXMVECTOR center, float radius) override;
FX_METHOD()
void SetTraceMask(const char* type, bool mask);
private:
LScene* m_pScene;
TraceQueryFilter* m_pFilter;
}FX_ENTITY(IsAbstract);
#endif // _SCENE_TRACE_ADAPTER_H
scene_trace_adapter_gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
#define REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
DECLARE_ABSTRACT_ENTITY("", SceneTraceAdapter, ITraceAdapter)
DECLARE_METHOD_VOID_2(SceneTraceAdapter, SetTraceMask, const char *, bool)
#endif //REFLANG_METADATA_CODE_GEN_EDITOR_SCENE_TRACE_ADAPTER_GEN_H
类类型反射标记宏
类类型如果需要支持反射,需要在定义后标记FX_CLASS ()。
reflection_test_define.h
class ClassTest
{
public:
ClassTest()
{
x = 0.0;
y = 0.0;
}
private:
FX_PROPERTY()
float x;
FX_PROPERTY()
float y;
}FX_CLASS();
支持的Meta:
- Parent=MyBaseClass(键值对)
说明:可选,指定MyBaseClass为其父反射类型。
(1)test_ref.h
#ifndef _TEST_REF_H
#define _TEST_REF_H
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
}FX_CLASS();
#endif // _TEST_REF_H
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
#ifndef _TEST_REF_H
#define _TEST_REF_H
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass : public ClassBase
{
public:
TestClass();
virtual ~TestClass();
}FX_CLASS();
#endif // _TEST_REF_H
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS_WITH_PARENT("", TestClass, ClassBase)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(3)test_ref.h
#ifndef _TEST_REF_H
#define _TEST_REF_H
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass : public ClassBase
{
public:
TestClass();
virtual ~TestClass();
}FX_CLASS(Parent="");
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
结构体类型反射标记宏
结构体类型如果需要支持反射,需要在定义后标记FX_STRUCT ()。
reflection_test_define.h
class StructTest
{
public:
StructTest()
{
x = 0.0;
y = 0.0;
}
FX_PROPERTY()
float x;
FX_PROPERTY()
float y;
}FX_STRUCT();
支持的Meta:
- Parent=MyBaseStruct(键值对)
说明:可选,指定MyBaseStruct为其父反射类型。
(1)test_struct.h
#ifndef _TEST_STRUCT_H
#define _TEST_STRUCT_H
#include "flexi/public/macros_reflection.h"
struct struct_base_t
{
int x;
}FX_STRUCT();
struct test_struct_t
{
int y;
}FX_STRUCT();
#endif //_TEST_STRUCT_H
test_struct.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
DECLARE_STRUCT("", struct_base_t)
DECLARE_STRUCT("", test_struct_t)
#endif //REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
(2)test_struct.h
#ifndef _TEST_STRUCT_H
#define _TEST_STRUCT_H
#include "flexi/public/macros_reflection.h"
struct struct_base_t
{
int x;
}FX_STRUCT();
struct test_struct_t : struct_base_t
{
int y;
}FX_STRUCT();
#endif //_TEST_STRUCT_H
test_struct.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
DECLARE_STRUCT("", struct_base_t)
DECLARE_STRUCT_WITH_PARENT("", test_struct_t, struct_base_t)
#endif //REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
(3)test_struct.h
#ifndef _TEST_STRUCT_H
#define _TEST_STRUCT_H
#include "flexi/public/macros_reflection.h"
struct struct_base_t
{
int x;
}FX_STRUCT();
struct test_struct_t : struct_base_t
{
int y;
}FX_STRUCT(Parent="");
#endif //_TEST_STRUCT_H
test_struct.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
DECLARE_STRUCT("", struct_base_t)
DECLARE_STRUCT("", test_struct_t)
#endif //REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
(4)test_struct.h
#ifndef _TEST_STRUCT_H
#define _TEST_STRUCT_H
#include "flexi/public/macros_reflection.h"
struct struct_base_t
{
int x;
}FX_STRUCT();
struct test_struct_t : struct_base_t
{
int y;
}FX_STRUCT(Parent=struct_base_t);
#endif //_TEST_STRUCT_H
test_struct.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
DECLARE_STRUCT("", struct_base_t)
DECLARE_STRUCT_WITH_PARENT("", test_struct_t, struct_base_t)
#endif //REFLANG_METADATA_CODE_GEN_TEST_STRUCT_GEN_H
枚举类型反射标记宏
枚举类型如果需要支持反射,需要在定义后标记FX_ENUM ()。
reflection_test_define.h
#ifndef _REFLECTION_TEST_DEFINE_H
#define _REFLECTION_TEST_DEFINE_H
#include "../public/i_entity.h"
#include "../public/i_interface.h"
#include "../utils/pod_traits.h"
#include "../public/macros_reflection.h"
typedef int int8;
namespace flexi
{
enum EnumTest
{
A,
B,
C,
D,
E,
F,
G,
}FX_ENUM();
}
全局函数反射标记宏
全局函数如果需要支持反射,需要在函数声明前标记FX_FUNCTION ()。
FX_FUNCTION()
inline int TestFunction(int x, int y)
{
return x + y;
}
支持的Meta:
- ReturnType(键值对)
说明:可选,全局函数返回类型。
(1)test_func.h
#ifndef _TEST_FUNC_H
#define _TEST_FUNC_H
#include "flexi/public/macros_reflection.h"
#include "flexi/public/i_var_list.h"
FX_FUNCTION()
void TestFunction(const IVarList& args, IVarList& result);
test_func.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_FUNC_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_FUNC_GEN_H
DECLARE_FUNCTION_N(TestFunction)
#endif //REFLANG_METADATA_CODE_GEN_TEST_FUNC_GEN_H
(2)test_func.h
#ifndef _TEST_FUNC_H
#define _TEST_FUNC_H
#include "flexi/public/macros_reflection.h"
#include "flexi/public/i_var_list.h"
FX_FUNCTION(ReturnType=Table)
void TestFunction(const IVarList& args, IVarList& result);
#endif // _TEST_FUNC_H
test_func.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_FUNC_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_FUNC_GEN_H
DECLARE_FUNCTION_T(TestFunction)
#endif //REFLANG_METADATA_CODE_GEN_TEST_FUNC_GEN_H
属性反射标记宏
实体、类或结构体的成员变量如果需要支持反射,需要在变量声明前标记FX_PROPERTY ()。
struct StructTest
{
StructTest()
{
x = 0.0;
y = 0.0;
}
FX_PROPERTY()
float x;
FX_PROPERTY()
float y;
}FX_STRUCT();
支持的Meta:
- Name(键值对)
说明:可选,属性名称。
如果没有写Name:
a. 成员变量中有大写字母,以成员变量的首个大写字母开始,到最后一个字符结束的子字符串作为属性名称。
b. 成员变量中没有大写字母,以成员变量名作为属性名称。
(1)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
private:
FX_PROPERTY(Func)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, X, GetX, SetX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
private:
FX_PROPERTY(Name=PropX, GetFunc=GetX, SetFunc=SetX)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, PropX, GetX, SetX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
- ReadOnly(键)
说明:可选,只读属性。
(1)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
private:
FX_PROPERTY(Func)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, X, GetX, SetX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
private:
FX_PROPERTY(Func, ReadOnly)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY_GET(int, TestClass, X, GetX, ReadOnly)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
- Func(键)
说明:可选,如果有Func键,则通过Get、Set拼接属性名后的函数访问属性。
(1)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
public:
FX_PROPERTY()
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY_OFFSET(int, TestClass, X, m_nX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
public:
FX_PROPERTY(Func)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, GetX, SetX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
- GetFunc(键或键值对)
说明:可选,没有Func键才有效。
如果有GetFunc键,则通过GetFunc值或者Get拼接属性名作为获得属性的方法。否则直接访问成员变量。
(1)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
public:
FX_PROPERTY()
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY_OFFSET(int, TestClass, X, m_nX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
int GetPropX() const { return m_nX; }
public:
FX_PROPERTY(GetFunc)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY_GET(int, TestClass, X, GetX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(3)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
int GetPropX() const { return m_nX; }
public:
FX_PROPERTY(GetFunc=GetPropX)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY_GET(int, TestClass, X, GetPropX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
- SetFunc(键或键值对)
说明:可选,有GetFunc键才有效。
如果有SetFunc键,则通过SetFunc值或者Set拼接属性名作为设置属性的方法。否则是只读属性。
(1)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
int GetPropX() const { return m_nX; }
public:
FX_PROPERTY(GetFunc)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY_GET(int, TestClass, X, GetX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
int GetPropX() const { return m_nX; }
public:
FX_PROPERTY(GetFunc, SetFunc)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, X, GetX, SetX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(3)test_ref.h
#include "flexi/public/macros_reflection.h"
class ClassBase
{
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
int GetPropX() const { return m_nX; }
void SetPropX(int val) { m_nX = val; }
public:
FX_PROPERTY(GetFunc, SetFunc=SetPropX)
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, X, GetX, SetPropX)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
- Type(键值对)
说明:可选,属性类型。
(1)test_ref.h
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
int GetPropX() const { return m_nX; }
void SetPropX(int val) { m_nX = val; }
const char* GetString() const { return m_strString.c_str(); }
void SetString(const char* val) { m_strString = val; }
public:
FX_PROPERTY(Func)
int m_nX;
FX_PROPERTY(Func)
core_string m_strString;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, GetX, SetX)
DECLARE_PROPERTY(core_string, TestClass, String, GetString, SetString)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
int GetPropX() const { return m_nX; }
void SetPropX(int val) { m_nX = val; }
const char* GetString() const { return m_strString.c_str(); }
void SetString(const char* val) { m_strString = val; }
public:
FX_PROPERTY(Func)
int m_nX;
FX_PROPERTY(Func, Type=const char*)
core_string m_strString;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, GetX, SetX)
DECLARE_PROPERTY(const char*, TestClass, String, GetString, SetString)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
成员函数反射标记宏
实体、类或结构体的成员方法如果需要支持反射,需要在方法声明前标记FX_METHOD ()。
class TestEntity : public IEntity
{
public:
virtual bool Init(const IVarList& args) override
{
return true;
}
virtual bool Shut() override
{
return true;
}
FX_METHOD()
float TestMethod(FX_META(Type=double) float x, float y)
{
return x + y;
}
}FX_ENTITY;
支持的Meta:
- ReturnType(键值对)
说明:可选,成员函数返回类型。
(1)test_ref.h
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
FX_METHOD(Name=PropX,GetFunc,SetFunc=SetX)
int GetPropX() const { return m_nX; }
void SetPropX(int val) { m_nX = val; }
FX_METHOD()
void GetList(const IVarList& args, IVarList& res) {}
public:
int m_nX;
}FX_CLASS();
#endif // _TEST_REF_H
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, PropX, GetPropX, SetX)
DECLARE_METHOD_N(TestClass, GetList)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
(2)test_ref.h
public:
ClassBase();
virtual ~ClassBase();
}FX_CLASS();
class TestClass
{
public:
TestClass();
virtual ~TestClass();
int GetX() const { return m_nX; }
void SetX(int val) { m_nX = val; }
FX_METHOD(Name=PropX,GetFunc,SetFunc=SetX)
int GetPropX() const { return m_nX; }
void SetPropX(int val) { m_nX = val; }
FX_METHOD(ReturnType=Table)
void GetList(const IVarList& args, IVarList& res) {}
public:
int m_nX;
}FX_CLASS();
test_ref.gen.h
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// !!!!!!!!!!!! 该文件由Reflang自动生成 !!!!!!!!!!!!
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#ifndef REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
#define REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
DECLARE_CLASS("", ClassBase)
DECLARE_CLASS("", TestClass)
DECLARE_PROPERTY(int, TestClass, PropX, GetPropX, SetX)
DECLARE_METHOD_T(TestClass, GetList)
#endif //REFLANG_METADATA_CODE_GEN_TEST_REF_GEN_H
函数参数反射标记宏
函数参数如果需要增加Meta信息,需要在函数参数声明前标记FX_META ()。
class TestEntity : public IEntity
{
public:
virtual bool Init(const IVarList& args) override
{
return true;
}
virtual bool Shut() override
{
return true;
}
FX_METHOD()
float TestMethod(FX_META(Type=double) float x, float y)
{
return x + y;
}
}FX_ENTITY();
支持的Meta:
- Type(键值对)
说明:类型,函数参数类型。
生成反射信息文件
包含反射头文件
例如输入文件为test.h,会生成对应的反射信息文件test.gen.h,需要在test.cpp文件中包含该生成的文件。
reflection_test_define.cpp
#include "reflection_test_define.h"
#include "../public/module.h"
#include "reflection_test_define.gen.h"
reflang.exe根据.gen.h查找待分析的.h头文件。具体规则是:
生成Flexi公共头文件的反射:
本模块code_gen路径:[module_path]/code_gen/
待分析头文件路径:flexi/xxx/yyy/zzz.h
当前CPP文件相对模块路径:[module_path]/aaa/bbb.cpp
当前CPP包含路径:#include "flexi/xxx/yyy/zzz.h"
.gen.h格式:#include "flexi/xxx/yyy/zzz.gen.h"
生成本模块外部头文件的反射:
本模块code_gen路径:[module_path]/code_gen/
待分析头文件路径:[module_path]/../xxx/yyy/zzz.h
当前CPP文件路径:[module_path]/aaa/bbb.cpp
则当前CPP包含路径:#include "../../../xxx/yyy/zzz.h"
.gen.h格式:#include "external_dependency/./xxx/yyy/zzz.gen.h" // 相对当前模块路径查找“bbb.h”(查找时忽略"gen.",忽略“external_dependency/”,'.'替换为'..')
生成本模块内部头文件的反射:
本模块code_gen路径:[module_path]/code_gen/
相同目录同名cpp与h
待分析头文件路径:[module_path]/aaa/bbb.h
当前CPP文件路径:[module_path]/aaa/bbb.cpp
则当前CPP包含路径:#include "bbb.h"
.gen.h格式:#include "bbb.gen.h" // 相对当前文件路径查找“bbb.h”(查找时忽略"gen.")
不同目录的cpp与h
待分析头文件路径:[module_path]/xxx/yyy/zzz.h
当前CPP文件路径:[module_path]/aaa/bbb.cpp
则当前CPP包含路径:#include "../xxx/yyy/zzz.h"
.gen.h格式:#include "xxx/yyy/zzz.gen.h" // 相对当前模块路径查找“xxx/yyy/zzz.h”(查找时忽略"gen.")
配置编译前事件
在模块的PreBuildEvent中添加命令:
$(SolutionDir)extern/reflang/bin/release/reflang.exe --solution_path $(SolutionDir) --module_path $(ProjectName) --input_file_filter ".+.h|.+.cpp" --code_gen_path code_gen --temp_path $(IntermediateOutputPath) --log_level summary --out_log "" --include_paths "" -- -std=c++11 -g -DREFLECTION_PARSER
说明:使用该命令会扫描指定模块下满足条件的文件,只对具有反射标记的类型及其属性和方法生成反射信息。
命令参数说明:
--solution_path:解决方案路径
--module_path:模块路径(相对于解决方案路径)
--input_file_filter:输入文件名过滤
--code_gen_path:反射信息文件输出路径
--temp_path:中间文件临时目录
-- log_level:日志等级(error, warning, summary, summary_input, log, verbose, very_verbose)
--out_log:输入日志文件名称(相对于中间文件临时目录)
--include_paths:解析时的附加包含路径
-std=c++11:使用std::c++11
-g:生成调试信息
-DREFLECTION_PARSER:反射信息解析
-I<dir>, --include-directory<arg>, --include-directory=<arg>
Add directory to include search path. If there are multiple -I options, these directories are searched in the order they are given before the standard system directories are searched. If the same directory is in the SYSTEM include search paths, for example if also specified with -isystem, the -I option will be ignored
更多命令参数使用可参考:https://clang.llvm.org/docs/ClangCommandLineReference.html
编译工程
编译工程前:会触发配置的编译前事件,即生成工程中的反射信息文件。
编译工程:如果工程代码中包含了编译前事件中生成的反射头文件,会将反射信息编译到编译单元中。