2013-04-17 33 views
2

当我生成(通过创一流),我通过javap的获得经检查下面的定义Clojure中的一类:clojure编译器生成的字节码中的“public static {}”是什么意思?

public class foo.bar extends java.lang.Object implements java.io.Serializable{ 
    public final java.lang.Object state; 
    public static {}; 
    public foo.bar(); 
    ... 
} 

我不知道什么构建公共静态{}系指我从来没有见过这样的事情之前...

有人可以告诉我吗?

回答

2

静态部分包含静态类初始化过程中运行(在创建任何类实例之前)码。

认为有副作用Clojure中的命名空间级别的代码 - 那些副作用,因为任何人都需要或使用该命名空间,即使他们实际上并不调用任何功能,一旦发生。这是一个可比较的情况。

+0

这是的javap的已编译的.class文件的输出。 谢谢查尔斯,这当然有道理! – rdanitz

1

听起来像在类的静态初始化块。

您可以使用该块初始化类的所有静态变量。但是,我从来没有见过这个“公开”的限定词。

试试这个在Java中,所以你看到的调用顺序

public class StaticTest { 

    { 
    System.out.println("Anonymous Block."); 
    } 

    static { 
    //probably equivalent to that public {} you see on your code. 
    System.out.println("Static Block."); 
    } 

    public StaticTest() { 
    System.out.println("Constructor."); 
    } 

    public static void main(String[] args) { 

    StaticTest test = new StaticTest() { 
      { 
       System.out.println("Anonymous block in instance."); 
      } 
    }; 
    } 
} 

当你执行这一点,打印如下:

> $ java StaticTest 
> Static Block. 
> Anonymous Block. 
> Constructor. 
> Anonymous block in instance. 
2

如果你看看javap的全输出(带javap -c ...)你会发现它只是clojure编译器在第一级访问之前执行的一堆代码。通常它是interning of vars它们稍后使用等等。

相关问题