reflection - D 中的编译时代码生成

标签 reflection compiler-construction code-generation d

我目前正在学习 D,我想知道的一件事是 D 是否有办法复制 JVM 语言的代码生成功能。

这是一个场景: 我有一个对象,我想根据该对象生成一个字符串,给出它的名称及其所有字段。在 Java/Scala 中,我可以只使用反射,但假设速度是一个问题。我可以使用字节码生成库来动态生成和编译一个无需反射即可执行此操作的类。该实现将分解为迭代对象的字段并通过递归获取其名称,并使用该信息动态生成直接访问字段的 Java(或字节码)。

如果您不喜欢这种场景,因为它很弱和/或不切实际,另一种可能更现实的场景是优化对象序列化。

我见过 D 的编译时评估和/或模板元编程用于在编译时预先计算斐波那契序列和其他递归算法之类的示例,但是有没有一种方法可以仅使用语言和编译器,或者您是否需要开发一个单独的代码生成器并在编译器之前运行它以获得此类功能?

最佳答案

这不仅可以做到,而且在 D2 中实际上已为您完成。您所需要的只是一个小型 mixin,将这些功能从编译时功能转换为运行时功能。

  • 对于类名,您所需要做的就是在类的作用域内评估 typeof(this).stringof

  • 要获取所有字段的列表,请尝试 __traits(allMembers, typeof(this)),然后过滤掉非字段的内容 (std.traits) > 在这里很有用)。

关于reflection - D 中的编译时代码生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3682620/

相关文章:

C++ Builder - Lib 和 Res 的区别

java - 如何从 javacc 方法返回字符串?

language-agnostic - 代码生成器与 ORM 与存储过程

C# 开关类型

Java 泛型 : Who is right, javac 或 Eclipse 编译?

java - 有很多 @Service 方法来检查 id 是否有结果

visual-studio - 保存 EDMX 时是否可以防止重新生成 T4 文件?

c# - 有什么东西可以使 T4 代码更……干净吗?

c# - 简单问题 : Reflections in C#

c# - 通过反射检索内部嵌套类的内部成员