gpt4 book ai didi

java - 使 javac 从非 java 依赖项进行编译

转载 作者:行者123 更新时间:2023-12-01 22:47:12 25 4
gpt4 key购买 nike

目标是以编程方式使用 javac(没有其他编译器)来编译扩展另一个类的 Java 类,该类不作为 java 源或字节码存在,也不能作为这些类提供。 Java 类作为源文件存在,或者作为字符串存在于内存中(我知道如何从字符串进行编译)。

我认为我需要的是 Hook 预编译类的查找。但到目前为止我还无法找到这部分。因此,如果我知道 javac 到底如何查找预编译类,如何 Hook 并提供我自己的表示,那么这个问题就得到了解答。

或者任何其他允许我动态提供所需依赖项的方式...

编辑:既然提到了 Groovy 并且其目的受到质疑,让我举一个例子......想象一下,你在 Groovy 中有一个名为 G 的类,它有一个类 J 的字段,它是一个 Java 类,并且 J 扩展了 G。没有 J 就无法编译 G,没有 G 就无法编译 J。但是我有 G 的 AST,如果我可以将 AST 与 javac 连接起来,我将能够编译 J,然后在 Groovy 编译器 G 中编译 - 或者反之亦然。目前,这是通过生成 stub 来绕过的,但我正在寻找更好的解决方案。

编辑2:要说得绝对清楚。这个问题的最终目标是让 groovy 编译器和 javac 编译器以某种方式相互交谈,它们可以告诉对方它们是否有某个类,然后让另一个编译器知道该某个类。让我再说一遍,由于未解析的类,字节码中的 stub 无法工作。在源代码中,当依赖于导入时,它们的工作至少类似。但由于 Groovy 编译器的性质(实际上与 javac 的处理方式类似),我们必须在相当早的阶段生成这些源 stub ,对于您可以在 groovy 中应用的大多数 ast 转换来说太早了。这就是一个问题

最佳答案

如果第一条评论是正确的,并且您在没有 B 的源代码或字节码的情况下尝试编译扩展 B 的类 A,那么我认为答案是“您不能”。如果您考虑一下编译子类意味着什么,您将意识到编译器需要来自父类(super class)的详细信息 - 有哪些方法,有哪些抽象方法,要放入跳转表中的内容,可能会 protected 变量和方法被引用等。Java 仍然是一种强类型语言(至少在撰写本文时)。

关于java - 使 javac 从非 java 依赖项进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25158340/

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