我一直在阅读人们为Java和C#等语言编写的库,这些库利用字节代码编织来完成诸如拦截函数调用,插入日志记录代码之类的事情。我还一直在阅读Lisp / Clojure宏试图更好地了解如何利用它们。我对宏的了解越多,它们似乎提供的功能与字节码编织库相同。功能是指在编译时处理代码的能力。
我一直在查看的库示例包括AspectJ,PostSharp和Cecil。
有什么可以做的而不是另一种?他们实际上解决了相同的问题,还是我在比较苹果和橙子?
我一直在阅读人们为Java和C#等语言编写的库,这些库利用字节代码编织来完成诸如拦截函数调用,插入日志记录代码之类的事情。我还一直在阅读Lisp / Clojure宏试图更好地了解如何利用它们。我对宏的了解越多,它们似乎提供的功能与字节码编织库相同。功能是指在编译时处理代码的能力。
我一直在查看的库示例包括AspectJ,PostSharp和Cecil。
有什么可以做的而不是另一种?他们实际上解决了相同的问题,还是我在比较苹果和橙子?
Answers:
字节码编织和宏是两回事。
字节码编织是一种拦截函数调用的方法,因此您可以在函数执行之前或之后将某种功能(通常是诸如日志记录之类的跨领域问题)注入到函数调用中。字节码编织在字节码级别完成,这意味着它在编译后发生。该功能本身不受影响。这是面向方面的编程使用的技术之一。
宏是扩展语言语法的一种方法。在最简单的形式中,宏只是记录击键,然后使用热键播放击键的一种方法。语言宏的工作方式与此类似。关键字或其他语法构造替代了某种形式的宏扩展。当然,这过于简单了;可以在这里找到特定于Lisp的宏的更好示例。
尽管LISP宏可能用于同一目的,但它们与Java字节码编织插件完全不同。LISP宏在LISP源代码级别扩展了LISP语法。由于LISP宏与其他LISP代码在同一级别上编写,因此它们是常用的语言功能。
Java字节码编织插件在JVM级别运行。尽管许多Java程序员可能会使用其他人编写的字节码编织插件,但很少有Java程序员编写自己的字节码编织插件。
Java编译器插件完成的某些工作很容易用动态语言完成。函数调用拦截特别简单。