2016-01-20 90 views
4

我有以下的Scala代碼將scala(包)對象反編譯爲java - 包含「new();」的靜態初始化程序- 那是什麼?

package x.y 

package object config { 

    type SomeType = AnotherType[YetAnotherOne] 
} 

以下是JDGUI使得它有什麼用Java

package x.y.config; 

import scala.reflect.ScalaSignature; 

@ScalaSignature(bytes="\006\001...") 
public final class package {} 

而且......

package x.y.config; 

public final class package$ 
{ 
    public static final MODULE$; 

    static 
    { 
    new(); 
    } 

    private package$() 
    { 
    MODULE$ = this; 
    } 
} 

我有消失沒有問題的type的定義(我期望scalac可以消除它

我也想知道下面具體是什麼:

static 
{ 
    new(); 
} 

模塊$得到解釋here

問題是,當我將Java代碼剪切並粘貼到我的IDE中時,它無法編譯。非打字public static final MODULE$;new();都沒有。

它只是一些反編譯錯位?我錯過了什麼嗎?

這是怎麼回事?


編輯:

爲每個請求:

javap -c -l -private package\$.class 
Compiled from "package.scala" 
public final class x.y.config.package$ { 
    public static final x.y.config.package$ MODULE$; 

    public static {}; 
    Code: 
     0: new   #2     // class x/y/config/package$ 
     3: invokespecial #12     // Method "<init>":()V 
     6: return 

    private x.y.config.package$(); 
    Code: 
     0: aload_0 
     1: invokespecial #13     // Method java/lang/Object."<init>":()V 
     4: aload_0 
     5: putstatic  #15     // Field MODULE$:Lx/y/config/package$; 
     8: return 
    LineNumberTable: 
     line 9: 0 
    LocalVariableTable: 
     Start Length Slot Name Signature 
      0  9  0 this Lx/y/config/package$; 
} 
+0

這可能是有趣的,看看有什麼'的javap -c -l -private'說,有關的類 –

+0

類初始化創建一個實例,並構造安裝新的實例作爲辛格爾頓MODULE $字段。 –

+0

這似乎是一個鍋爐板代碼初始化單,但我對此事一無所知斯卡拉 –

回答

3

我不是一個專家階,但它似乎正常對我來說,作爲 「對象」 定義一個單獨的對象。見http://docs.scala-lang.org/tutorials/tour/singleton-objects.html

+0

我知道他們這樣做,我不知道究竟如何,這是我想出了上面的代碼... – Yaneeve

+0

也許使用的java的反編譯器進行反編譯Scala代碼是不是一個好主意......生成的字節碼是有可能略有不同,仍然是基於相同的指令 –

+0

我猜想,爪哇 - >字節碼是[雙射(HTTPS://en.wikipedia。 org/wiki/Bijection)功能 – Yaneeve

0

繼在@ acartapanis的答案有趣的意見,我已經找到了以下decompilation

package org.cakesolutions.scala.basic; 

public final class EmptyObject$ 
{ 
    public static final EmptyObject$ MODULE$; 

    static { 
     new EmptyObject$(); 
    } 

    private EmptyObject$() { 
     MODULE$ = this; 
    } 
} 

這確實更有意義......

完整的博客:Scala Dissection: Basic Types是非常有趣和翔實。我也想包括以下報價:

對於Scala代碼(和其他JVM語言,如科特林)我發現 南河反編譯器是非常好的,我們會堅持下去這個 系列。南河是字節代碼 瀏覽器所支持的5個反編譯(中DJ-GUI /核心,CFR,Fernflower和喀拉喀託)

記住,反編譯器是不完美的,而且容易產生 Java代碼ISN」之一在第t編譯嘗試