我知道它不受支持,但我想知道是否有任何技巧。有什么建议吗?
最佳答案
一般来说,反射是程序分析某些代码结构的一种手段。 此分析用于更改代码的有效行为。
作为分析的反射通常很弱;通常它只能提供对函数名和字段名的访问。这一弱点来自于语言实现者基本上不想在运行时提供完整的源代码,以及适当的分析例程以从源代码中提取想要的内容。
另一种方法是直接进行程序分析,方法是使用强大的程序分析工具,例如,可以完全按照编译器的方式解析源文本的工具。 (通常人们建议滥用编译器本身来做这件事,但这通常是行不通的;编译器机器想成为一个编译器,很难将它用于其他目的)。
我们需要的是一种工具:
- 解析语言源文本
- 构建代表程序每个细节的抽象语法树。 (如果 AST 保留源的注释和其他详细信息,这将很有帮助 代码布局,例如列号、文字基数值等)
- 构建符号表,显示每个标识符的范围和含义
- 可以从函数中提取控制流
- 可以从代码中提取数据流
- 能为系统构建调用图
- 可以判断每个指针指向什么
- 能够使用上述事实构建自定义分析器
- 可以根据此类自定义分析转换代码 (通常通过修改表示已解析代码的 AST)
- 可以重新生成源文本(包括布局和注释) 修订后的 AST。
使用这种机制,可以在需要的任何详细级别实现分析,然后转换代码以达到运行时反射可以达到的效果。 有几个主要的好处:
- 分析的详细程度或数量取决于雄心(例如,它不是 受限于运行时反射只能做什么)
- 没有任何运行时开销来实现反射(reflect)的行为变化
- 所涉及的机制可以是通用的并且适用于多种语言,而不是 而不是局限于特定语言实现提供的内容。
- 这符合 C/C++ 的理念,即您无需为不使用的东西付费。 如果你不需要反射(reflection),你就不需要这个机器。还有你的语言 不需要内置弱反射的智力包袱。
查看我们的 DMS Software Reengineering Toolkit对于可以为 C、Java 和 COBOL 执行上述所有操作的系统,以及可以为 C++ 执行大部分操作的系统。
[编辑 2017 年 8 月:现在处理 C11 和 C++2017]
关于c - C中的反射支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1353022/