是否可以在Delphi中进行面向方面的编程?我会对 native 支持以及第三方解决方案感兴趣。

我没有要使用AOP解决的特定问题,但是只是对学习AOP感兴趣。

最佳答案

AOP取决于两件事:

  • 将附加代码注入(inject)现有代码单元
  • 的能力
  • 一种在应将代码注入(inject)到何处放置条件的机制。

  • 这通常称为代码编织。它是程序转换的大型研究领域的专业。

    与静态编译程序相比,JIT编译语言具有更多实现代码编织的选项,因为字节码/IL中保留了更多信息。它们还支持反射,该反射提供了在运行时操纵代码的功能。

    与其他任何.NET语言一样,Delphi.NET和Prism对这些功能的访问方式相同。

    我知道有两个用于Delphi Win32的AOP框架。第一个是MeAOP,已经提到过。第二个是Infra。这两个项目对AOP都采用类似的方法。它们结合使用RTTI和巧妙的指针操作来拦截方法调用,因此您可以在方法调用之前或之后运行其他代码。您可以将横切功能定义为框架的AOP类的子类。您可以通过将方法名称作为字符串参数传递给AOP框架来注册要拦截的方法。

    这两个框架仍在积极开发中,实际上其范围不仅限于AOP。不幸的是,文档有些稀疏(在Infra的情况下,大多数是葡萄牙语)

    另一个项目在2004年尝试通过源代码编织进行AOP,但取得了一些成功。基本上,他们在称为DMS的通用程序转换工具的基础上构建了一个Aspect Weaver,并在编译之前将其用于将代码注入(inject)到delphi源文件中。他们的面向方面的语言主要受AspectJ的影响。

    http://www.gray-area.org/Research/GenAWeave/包含原始论文和演示的链接,以及有关转换过程的一些视频。

    也可以使用运行时代码检测来完成此操作。它是某些探查器使用的一种在不修改原始源代码的情况下将计数器和跟踪记录注入(inject)正在运行的代码中的技术。可以使用类似的技术将横切关注点注入(inject)静态编译的可执行文件中。 PinTool项目就是一个很好的例子。

    关于delphi - Delphi中的AOP支持,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/197731/

    10-12 05:57