目前我正在编写一个Scala宏库,我想让它也可以在Java中使用。但我想不出从Java源代码访问Scala宏方法的方法。有没有什么方法可以使用Java中的Scala宏方法。
apeeds0o1#
Scala宏是Scala编译器的指令,Java代码是由javac编译的,它对Scala和Scala宏一无所知,所以我猜答案是:没有办法在Java中使用它们。
pu3pd22g2#
Scala宏是Scala编译器的指令,这是事实。因此,如果您想在Java中执行它们,那么在Java中,您必须运行Scala编译器
<dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-reflect</artifactId> <version>2.13.10</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>2.13.10</version> </dependency>
// java import scala.reflect.api.JavaUniverse; import scala.tools.reflect.ToolBox; public class App { public static void main(String[] args) { new App().run(); } public void run() { scala.reflect.runtime.package$ runtime = scala.reflect.runtime.package$.MODULE$; JavaUniverse universe = runtime.universe(); JavaUniverse.JavaMirror mirror = universe.runtimeMirror(this.getClass().getClassLoader()); scala.tools.reflect.package$ toolsReflect = scala.tools.reflect.package$.MODULE$; ToolBox<?> toolBox = toolsReflect.ToolBox(mirror).mkToolBox(toolsReflect.mkSilentFrontEnd(), ""); toolBox.eval(toolBox.parse("Macros.hello()")); // Hello World! } }
// scala import scala.language.experimental.macros import scala.reflect.macros.blackbox object Macros { def hello(): Unit = macro hello_impl def hello_impl(c: blackbox.Context)(): c.Tree = { import c.universe._ q"""println("Hello World!")""" } }
Is there any trick to use macros in the same file they are defined?
2条答案
按热度按时间apeeds0o1#
Scala宏是Scala编译器的指令,Java代码是由javac编译的,它对Scala和Scala宏一无所知,所以我猜答案是:没有办法在Java中使用它们。
pu3pd22g2#
Scala宏是Scala编译器的指令,这是事实。因此,如果您想在Java中执行它们,那么在Java中,您必须运行Scala编译器
Is there any trick to use macros in the same file they are defined?