gpt4 book ai didi

java - 编写引用现有 Java 类的代码生成器

转载 作者:行者123 更新时间:2023-12-04 03:50:23 27 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

8年前关闭。




Improve this question




我正在尝试评估不同的方法,以便在构建项目时从特定领域语言的定义中自动生成我们的 Java 项目中的一些代码。我过去手动编写过一两个代码生成器,但我没有使用现有代码生成框架的经验。我们还没有决定是使用这样的框架还是手动构建生成器。

我需要一个概念问题的帮助;我想了解如何构建允许 DSL 引用现有(手写)Java 类、方法和字段的代码生成器 .应该可以引用与生成的 Java 类在同一编译单元(例如 Maven 项目)中的类。这意味着在运行代码生成器之前无法编译这些手写类,并且代码生成器除了需要在类路径上编译这些类所需的所有内容之外,还必须查看 Java 源文件。

如果有的话,现有框架如何处理这种情况?他们是自己解析 Java 源文件还是重用 Java 编译器的某些机制?

我认为这与任何针对 JVM 的(非动态)非 Java 语言所面临的问题相同,如果它允许自己的代码在相同的编译单元中引用 Java 类,反之亦然。看看这些编译器是如何工作的也许会有所帮助,除非它们绕过 javac。还包括自己的Java编译器。

代码生成器需要访问同一编译单元的 Java 文件中的类的原因有多种:

  • 我想提供类似于 Java 中的语义,我可以 import <package>.*然后使用这些类的名称而不完全限定每个类的名称。
  • 如果 DSL 中的代码引用不存在或不符合某些必需标准的符号,我想拒绝它。
  • 在某些情况下,我想生成依赖于类成员或方法签名的代码。一个示例是自动生成装饰器或构建器或实现接口(interface),但代码生成器不生成基类或接口(interface)。
  • 我可能想在生成代码中使用引用符号的类型信息。例如根据方法的签名生成不同的代码。

  • 我们的项目使用 Maven。我对解决这些问题的一般方法很感兴趣,但非常感谢适用于 Maven 的信息或示例。

    如何使用允许 DSL 编译器引用外部 Java 元素(类、方法、字段)的 DSL 扩展 Java?

    最佳答案

    实际上不清楚你在问什么,而且这个问题比程序更理论化。

    无论如何,根据我自己的 DSL 实现经验,使用 java 没有任何问题。 classloaders用于动态访问新生成和编译的 java 类。此外,如果您使用 maven ,因此所有具有生产范围的依赖项都必须加载到主类加载器中,并且可以使用 reflection 加载它们.

    以下是一些有用的链接:

  • http://www.javaworld.com/article/2077260/learn-java/the-basics-of-java-class-loaders.html
  • http://tutorials.jenkov.com/java-reflection/dynamic-class-loading-reloading.html
  • http://docs.oracle.com/javase/tutorial/reflect/
  • 关于java - 编写引用现有 Java 类的代码生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21477283/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com