我正在寻求有关在Clojure中调用scala compiler的帮助。该行将如何转换为clojure?
final G.Run run = g.new Run();
答案 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)))