代码之家  ›  专栏  ›  技术社区  ›  jwfearn

Java中的静态元编程是可能的吗?

  •  34
  • jwfearn  · 技术社区  · 16 年前

    我是个迷 static metaprogramming in C++ . 我知道Java现在有泛型。这是否意味着Java中的静态元编程(即编译时程序执行)是可能的?如果是这样的话,有人能推荐一些好的资源来让你了解更多吗?

    9 回复  |  直到 8 年前
        1
  •  23
  •   Community Lee Campbell    7 年前

    不,这是不可能的。泛型不如模板那么强大。例如,模板参数可以是用户定义的类型、基元类型或值;但是通用模板参数只能是 Object 或其亚型。

    编辑:这是一个老的答案,因为2011我们有Java 7,它有 Annotations that can be used for such trickery .

        2
  •  12
  •   Lou Franco    16 年前

    看一看 Clojure . 这是一个带有宏(元编程)的LISP,它运行在JVM上,与Java非常可互操作。

        3
  •  5
  •   iirekm    14 年前

    “静态元编程”到底是什么意思?是的,C++模板元编程在Java中是不可能的,但是它提供了比C++更强大的其他方法:

    • 反射
    • 面向方面编程(@aspectj)
    • 字节码操作(JavaScript,ObjectWeb ASM,Java代理)
    • 代码生成(注释处理工具、模板引擎,如Velocity)
    • 抽象语法树操作(流行的IDE提供的API)
    • 在运行时运行Java编译器和使用编译代码的可能性

    没有最好的方法:每种方法都有其优点和缺点。 由于JVM的灵活性,Java中的所有这些方法都可以在编译时和运行时使用。

        4
  •  3
  •   Torsten Marek    16 年前

    不。更重要的是,编译器会将泛型类型擦除到其上限,因此您无法在运行时创建泛型类型T的新实例。

    在Java中进行元编程的最好方法是绕过类型擦除并提交。 Class<T> 对象类型T。不过,这只是一个黑客。

        5
  •  2
  •   larsivi    16 年前

    不,Java中的泛型纯粹是避免对象的投射的一种方式。

        6
  •  2
  •   Blake Miller    14 年前

    如果您需要强大的Java编译时逻辑,一种方法是使用某种代码生成。正如其他海报所指出的,Java语言不提供任何适合编译时间逻辑的特性,这可能是你最好的选择(如果你真的需要编译时逻辑)。一旦你用尽了其他的可能性 当然 如果您想生成代码,您可能会对我的开源项目rjava感兴趣,请访问:

    http://www.github.com/blak3mill3r

    它是在Ruby中编写的Java代码生成库,我为Ruby on Rails应用程序自动生成谷歌Web工具包接口。事实证明,这样做非常方便。

    作为一个警告,调试RJava代码可能非常困难,RJava不做太多的检查,它只是假设您知道自己在做什么。这几乎就是静态元编程的状态。我认为调试比用C++ TMP做的任何事情都要容易得多,而且可以用它来做同样的事情。

    不管怎样,如果你正在考虑编写一个输出Java源代码的程序,立即停止并检查Rjava。它可能还没有达到你想要的效果,但是它是麻省理工学院的许可证,所以你可以随意改进它,油炸它,或者卖给你的奶奶。我很高兴有其他的开发人员有经验的通用编程,以评论设计。

        7
  •  1
  •   jmagica    16 年前
        8
  •  1
  •   Community Lee Campbell    7 年前

    Lombok 提供了一种弱形式的编译时元编程。然而,他们使用的技术是 completely general .

    Java code transform at compile time 进行相关讨论

        9
  •  0
  •   Bill K    14 年前

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

    在爪哇,你可以思考找到关于你的类的信息,并做所有元编程所能做的事情,你只需在代码中完成它们,而不需要添加新的语法和不同的思维方式。注释还能够以更结构化的方式执行某些元编程任务。

    我可能错了,我正在认真考虑打开一个关于它的问题,因为我不确定我是否明白。看起来静态的元编程是一个整洁的黑客,它可以理解一些语言在运行时不具备很多编译时间信息(Java和动态语言的强项之一)。

    如果有人能用一个链接来回复这样一个例子,在这个例子中,元编程提供了一个比反射更易于理解、更可读或更好的解决方案,我会感谢这一努力。