【发布时间】:2014-08-06 10:44:28
【问题描述】:
我们的目标是以编程方式使用 javac(没有其他编译器)来编译扩展另一个类的 Java 类,该类不作为 java 源代码或字节码存在,也不能作为这些类提供。 Java 类作为源文件存在,或者作为字符串存在于内存中(我知道如何从字符串编译)。
我认为挂钩到预编译类的查找是我需要的。但到目前为止,我无法找到这部分。因此,如果我知道 javac 究竟是如何查找预编译类的,我如何挂钩并提供我自己的表示,那么这个问题就得到了回答。
或任何其他允许我动态提供所需依赖项的方式...
编辑: 既然提到了 Groovy 并且目的受到质疑,那么让我举个例子...... 想象一下,您在 Groovy 中有一个名为 G 的类,具有 J 类的字段,它是一个 Java 类,J 扩展了 G。没有 J 就无法编译 G,没有 G 也无法编译 J。但是我有 G 的 AST,如果我可以将 AST 与 javac 连接起来,我将能够编译 J,然后在 Groovy 编译器 G 中编译 - 或者相反。目前这是通过生成存根绕过的,但我正在寻找更好的解决方案。
编辑 2: 说得一清二楚。这个问题的最终目标是让 groovy 编译器和 javac 编译器以某种方式相互交谈,如果它们有某个类,它们可以相互告知,然后让另一个编译器知道该特定类。让我再说一遍,字节码中的存根由于未解析的类而无法工作。在源代码中,它们的工作方式取决于进口解决方案至少相似。但是由于 Groovy 编译器的性质,它实际上有点类似于 javac 所做的处理,我们必须在相当早的阶段生成这些源存根,对于您可以在 groovy 中应用的大多数 ast 转换来说还为时过早。这是一个问题
【问题讨论】:
-
听起来很奇怪。你将如何开设这门课?再次没有基类?这一次您将需要连接到 JVM。您可能想解释一下您的主要任务是什么,您是如何得出这个解决方案的,以及为什么您没有基类。
-
我更新了问题以尝试解释一下情况。