如何在Clojure中调用'最终G.Run run = g.new Run()'

时间:2018-09-07 06:18:40

标签: clojure

我正在寻求有关在Clojure中调用scala compiler的帮助。该行将如何转换为clojure?

final G.Run run = g.new Run();

1 个答案:

答案 0 :(得分:3)

Java的内部类只是用于在其(语法)构造函数中传递外部类引用的类的语法糖。

我不知道在Clojure中调用此类构造函数的任何语法糖。但是我们可以检查一下这种Java语言的语法糖如何转换为生成的JVM字节码。

让我们举个例子:

package test;

public class Outer {
    public String oName;

    public Outer(String name) {
        this.oName = name;
    }

    public class Inner {
        public String iName;
        public Inner(String name) {
            this.iName = name;
        }
    }
}

当我们编译此代码并检查生成的字节码时,我们可以看到test.Outer.Inner类中已经生成了以下语法构造函数(使用javap -verbose Outer\$Inner.class命令):

public test.Outer$Inner(test.Outer, java.lang.String);
    descriptor: (Ltest/Outer;Ljava/lang/String;)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=3, args_size=3
         0: aload_0
         1: aload_1
         2: putfield      #1                  // Field this$0:Ltest/Outer;
         5: aload_0
         6: invokespecial #2                  // Method java/lang/Object."<init>":()V
         9: aload_0
        10: aload_2
        11: putfield      #3                  // Field iName:Ljava/lang/String;
        14: return
      LineNumberTable:
        line 12: 0
        line 13: 9
        line 14: 14

在Java中,我们不直接使用此构造函数,而是由Java编译器生成对其的调用。

所以这段Java代码:

Outer outer = new Outer("outer");
Outer.Inner inner = outer.new Inner("inner");

在JVM字节码中被编译为如下所示:

Outer outer = new Outer("outer");
Outer.Inner inner = new Outer.Inner(outer, "inner");

我们可以在Clojure中利用它,并将JVM字节码版本转换为Clojure代码:

(import '[test Outer Outer$Inner])

(let [outer (Outer. "outer")
      inner (Outer$Inner. outer "inner")]
  (println "Outer" (.-name outer))
  (println "Inner" (.-name inner)))