使用Java中的Scala宏

dtcbnfnu  于 2022-11-09  发布在  Scala
关注(0)|答案(2)|浏览(132)

目前我正在编写一个Scala宏库,我想让它也可以在Java中使用。
但我想不出从Java源代码访问Scala宏方法的方法。有没有什么方法可以使用Java中的Scala宏方法。

apeeds0o

apeeds0o1#

Scala宏是Scala编译器的指令,Java代码是由javac编译的,它对Scala和Scala宏一无所知,所以我猜答案是:没有办法在Java中使用它们。

pu3pd22g

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?

相关问题