我的粉丝 静元编程在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。它可能不会做你想要的,但它是麻省理工学院的许可,所以随时改进它,炸它,或卖给你的奶奶。我很高兴有其他对通用编程有经验的开发人员对设计发表评论。

Lombok 提供了一种弱形式的编译时元编程。但是,他们使用的技术是完全一般

参见编译时的Java代码转换以进行相关讨论

我不确定我是否理解静态元编程的优势。

在Java中,您可以反思以查找有关您的类的信息并完成元编程所做的所有事情,您只需在代码中执行它们,而无需添加新语法和不同的思维方式。注释还能够以更有条理的方式执行某些元编程任务。

我可能错了,我正在认真考虑开一个问题,因为我不确定我是否得到了它。看起来静态元编程是一个巧妙的黑客,可以解决这样一个事实,即某些语言在运行时不能保留大量的编译时信息(Java和动态语言的优点之一)。 / p>

如果有人能够回复链接到一个示例,其中元编程提供了比反思更容易理解,可读或更好的解决方案,我会很感激。

Manifold项目提供了类型安全的静态元编程Java的。当Javac解析类型名称时,您可以使用它在编译时动态构建类型。 JSON Schema演示演示了动态编译时类型投影的静态元编程(无代码生成构建步骤。)

此外,您可以使用Manifold添加新功能。查看结构类型方法扩展类型 - 安全反思

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top