Java是否可以进行静态元编程?
我是C ++中静态元编程的迷。我知道Java现在有了泛型。这是否意味着在Java中可以进行静态元编程(即,编译时程序执行)?如果是这样,任何人都可以推荐任何好的资源以使他们了解更多吗?
解决方案
不,Java中的泛型纯粹是避免转换对象的一种方法。
不,这是不可能的。泛型不如模板强大。例如,模板参数可以是用户定义的类型,原始类型或者值。但是通用模板参数只能是"对象"或者其子类型。
编辑:这是一个旧答案;自2011年以来,我们有了Java 7,其中包含可用于此类欺骗的Annotations。
不会。甚至,泛型类型会被编译器擦除到上限,因此我们无法在运行时创建泛型T的新实例。
在Java中进行元编程的最好方法是规避类型擦除,并提交类型T的" Class <T>"对象。不过,这仅仅是一个hack。
看看Clojure。这是一个具有宏(元编程)的LISP,可在JVM上运行,并且可与Java很好地互操作。
从一个非常简化的意义上讲,也许吧?
http://michid.wordpress.com/2008/08/13/type-safe-builder-pattern-in-java/
我不确定我是否了解静态元编程的优势。
在Java中,我们可以进行思考以找到有关类的信息并完成元编程将要执行的所有工作,而无需添加新的语法和不同的思维方式,我们只需在代码内部进行操作即可。注释还能够以更结构化的方式执行某些元编程任务。
我对此可能是错的,我正在认真考虑就此提出一个问题,因为我不确定我是否会明白。似乎静态元编程是个巧妙的解决方案,它绕开了一个事实,即某些语言在运行时没有提供很多编译时信息(Java和动态语言的强项之一)。
如果有人可以通过链接返回示例,其中元编程提供了比反射更易理解,可读性更好的解决方案,我将不胜感激。
如果我们需要Java强大的编译时逻辑,一种实现方法是某种代码生成。正如其他发帖人所指出的那样,由于Java语言没有提供适合执行编译时逻辑的任何功能,因此这可能是最佳选择(如果我们确实确实需要编译时逻辑)。一旦用尽了其他可能性,并且确定要进行代码生成,我们可能会对我的开源项目Rjava感兴趣,该项目可在以下位置找到:
http://www.github.com/blak3mill3r
这是一个用Ruby编写的Java代码生成库,我编写该库是为了自动为Ruby on Rails应用程序生成Google Web Toolkit接口。事实证明,这非常方便。
作为警告,调试Rjava代码可能非常困难,Rjava并没有做太多检查,只是假设我们知道自己在做什么。无论如何,这几乎是静态元编程的状态。我想说,它比使用C ++ TMP所做的任何非凡的事情要容易得多,并且可以将其用于相同类型的事情。
无论如何,如果我们正在考虑编写一个输出Java源代码的程序,请立即停止并签出Rjava。它可能无法满足要求,但是它已获得MIT的许可,因此可以随时对其进行改进,油炸或者出售给祖母。我很高兴有其他具有通用编程经验的开发人员对设计发表评论。
我们所说的"静态元编程"到底是什么意思?是的,C ++模板元编程在Java中是不可能的,但是它提供了比C ++强大得多的其他方法:
- 反射
- 面向方面的编程(@AspectJ)
- 字节码操作(Javassist,ObjectWeb ASM,Java代理)
- 代码生成(注释处理工具,诸如Velocity之类的模板引擎)
- 抽象语法树操作(流行的IDE提供的API)
- 即使在运行时也可以运行Java编译器并使用已编译的代码
没有最好的方法:每种方法都有其优点和缺点。
由于JVM的灵活性,Java中的所有这些方法都可以在编译时和运行时使用。