Java是否可以进行静态元编程?
我是C ++中静态元编程的迷。我知道Java现在有了泛型。这是否意味着在Java中可以进行静态元编程(即,编译时程序执行)?如果是这样,任何人都可以推荐任何好的资源,以便在其中可以了解更多的信息?
回答:
简短的答案
这个问题已经有10多年的历史了,但是我仍然缺少一个答案。这是: ,但不是 因为 泛型,并且注释与C ++完全相同。
从Java 6开始,我们具有可插入注释处理api。静态元编程是(正如您在问题中已经提到的那样)
编译时程序执行
如果您了解元编程,那么您也知道这不是真的,但是为了简单起见,我们将使用它。请看看这里,如果你想了解更多关于一般的元编程。
在读取.java文件之后但在编译器将字节码写入.class文件之前,编译器将调用可插入注释处理api。(我有一个消息源,但是我找不到了。也许有人可以在这里帮助我?)。
它允许您在编译时使用纯Java代码进行逻辑处理。但是,您所编码的世界完全不同。没有特别的坏,没有什么,只是有所不同。您正在分析的类尚不存在,并且您正在处理这些类的元数据。但是编译器在JVM中运行,这意味着您也可以正常创建类和程序。但此外,您可以分析泛型,因为
类型擦除 会调用我们的注释处理器。
关于Java中静态元编程的主要要点是,您提供元数据(以注释的形式),并且处理器将能够找到所有带注释的类来对其进行处理。在(更简单的)示例可以在Baeldung上找到,在该示例中形成了一个简单的示例。我认为,这是一个很好的入门资源。如果您了解这一点,请尝试使用Google自己。有很多好的资源,这里有很多。还可以看看利用注释处理器的Google
AutoService,它消除了创建和维护服务文件的麻烦。如果要创建类,我建议您看一下JavaPoet。
遗憾的是,此API不允许我们操纵源代码。但是,如果您确实愿意,应该看看Lombok项目。他们这样做,但是不支持。
为什么如此重要(进一步阅读感兴趣的人)
这让我感到莫名其妙,为什么我们不使用静态元编程而不使用动态元编程,因为它具有许多优点。
大多数开发人员看到了“动态和静态”,并立即得出结论:动态更好。毫无疑问,static对开发人员有很多负面的含义。但是在这种情况下(特别是对于Java),这是完全相反的方法。
动态元编程需要反思,这有一些
主要
缺点。有很多。简而言之:性能,安全性和设计。
静态元编程(即注释处理)使我们可以与编译器相交,该编译器已经完成了我们尝试使用反射完成的大部分工作。我们还可以在此过程中创建类,然后将它们再次传递给注释处理器。然后,您可以(例如)生成类,这些类通常需要使用反射来完成。此外,我们可以实现“快速失败”系统,因为我们可以将错误,警告等信息告知编译器。
总结并尽可能多地进行比较:让我们想象一下Spring。Spring尝试在运行时查找所有带组件注释的类(可以在编译时使用服务文件进行简化),然后生成某些代理类(在编译时就已经可以完成)并解析Bean依赖项(再次,我们已经可以在编译时完成)。杰克·沃顿(Jake
Whartons)谈到了Dagger2,他在其中解释了为什么他们转向静态元编程。我仍然不明白为什么像Spring这样的大公司不使用它。
简而言之,这篇文章旨在全面解释这些差异以及为什么static会更强大。如果您愿意,我目前正在为此进行演示。如果您有兴趣并说德语(对此感到抱歉),则可以查看我的网站。在那里您可以找到一个演示文稿,该演示文稿试图解释45分钟内的差异。虽然只有幻灯片。
以上是 Java是否可以进行静态元编程? 的全部内容, 来源链接: utcz.com/qa/410013.html