题
我的粉丝 静元编程在C++.我知道Java现在有仿制药。这是不是意味着静元编程(即编写时执行程序)是可能在Java?如果是这样,任何人都可以推荐任何良好的资源之一可以了解更多关于它?
解决方案
不,这是不可能的。泛型不如模板强大。例如,模板参数可以是用户定义的类型,基元类型或值;但通用模板参数只能是Object
或其子类型。
编辑:这是一个老答案;自2011年以来,我们拥有Java 7,它具有可用于此类欺骗的注释。
其他提示
查看 Clojure 。它是一个带有宏的LISP(元编程),它运行在JVM上,并且与Java非常互操作。
什么你究竟意味着通过"静元编程"?是的,C++模板元编程是不可能的,但它提供了其他方法,更加强有力,比那些从C++:
- 反射
- 面向方面可编程(@样aspect)
- 码操纵(Javassist,ObjectWeb ASM、Java代理)
- 代码生成(注加工工具、模板引擎速度)
- 抽象的法树的操作(Api提供的受欢迎的IDEs)
- 可以运行Java编译器和使用的编码,即使在运行
有没有更好的方法:每个方法都有其长处和弱点。由于灵活性的JVM,所有这些方法在Java可使用的在汇编时间和运行时间。
没有。更进一步,泛型类型被编译器擦除到其上限,因此您无法在运行时创建泛型类型T的新实例。
在Java中进行元编程的最佳方法是绕过类型擦除并交付类型T的Class<T>
对象。但是,这只是一个黑客攻击。
不,Java中的泛型纯粹是一种避免使用Object的方法。
如果您需要强大的Java编译时逻辑,一种方法是使用某种代码生成。因为,正如其他海报所指出的那样,Java语言没有提供任何适合编译时逻辑的功能,这可能是你最好的选择(如果你确实需要编译时逻辑)。一旦你已经用尽其他可能性并且你确定你想要代码生成,你可能会对我的开源项目Rjava感兴趣,可以在:
http://www.github.com/blak3mill3r
这是一个用Ruby编写的Java代码生成库,我编写这个库是为了自动为Ruby on Rails应用程序生成Google Web Toolkit接口。事实证明它非常方便。
作为警告,调试Rjava代码非常困难,Rjava没有做太多检查,它只是假设你知道你正在做什么。无论如何,这几乎就是静态元编程的状态。我说它比使用C ++ TMP完成的任何非常重要的事情都要容易得多,并且可以将它用于同样的事情。
无论如何,如果您正在考虑编写一个输出Java源代码的程序,请立即停止并查看Rjava。它可能不会做你想要的,但它是麻省理工学院的许可,所以随时改进它,炸它,或卖给你的奶奶。我很高兴有其他对通用编程有经验的开发人员对设计发表评论。
在非常简单的意义上,也许吧? http://michid.wordpress.com / 2008/08/13 /类型安全助洗剂图案中的Java /
Lombok 提供了一种弱形式的编译时元编程。但是,他们使用的技术是完全一般。
参见编译时的Java代码转换以进行相关讨论
我不确定我是否理解静态元编程的优势。
在Java中,您可以反思以查找有关您的类的信息并完成元编程所做的所有事情,您只需在代码中执行它们,而无需添加新语法和不同的思维方式。注释还能够以更有条理的方式执行某些元编程任务。
我可能错了,我正在认真考虑开一个问题,因为我不确定我是否得到了它。看起来静态元编程是一个巧妙的黑客,可以解决这样一个事实,即某些语言在运行时不能保留大量的编译时信息(Java和动态语言的优点之一)。 / p>
如果有人能够回复链接到一个示例,其中元编程提供了比反思更容易理解,可读或更好的解决方案,我会很感激。
Manifold项目提供了类型安全的静态元编程Java的。当Javac解析类型名称时,您可以使用它在编译时动态构建类型。 JSON Schema演示演示了动态编译时类型投影的静态元编程(无代码生成构建步骤。)