2013-09-05 43 views
0

我知道,當一個類有一個內部類,那麼這個類將被編譯爲兩個類文件。今天我的代碼如下爲什麼在編譯時創建兩個類文件?

public class GenericDeserializer { 

    public static void main(String[] args) { 
     String cityPageLoadJson = "{\"count\":2,\"pageLoad\":[{\"id\":4,\"name\":\"HAN\"},{\"id\":8,\"name\":\"SGN\"}]}"; 
     Type type = new TypeToken<GenericResult<City>>() { 
     }.getType(); 
     Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
     GenericResult<City> cityPageLoad = gson.fromJson(cityPageLoadJson, type); 
     for (City city : cityPageLoad.getPageLoad()) { 
      System.out.println(gson.toJson(city)); 
     } 
    } 

} 

雖然上面的人有沒有內部類,Java編譯器還創建了兩個類文件:

GenericDeserializer.class 
GenericDeserializer$1.class 

使用Java Decompiler工具,我看到的第二

內容
package net.tuandn.training.lesson.gson; 

import com.google.gson.reflect.TypeToken; 
import net.tuandn.training.model.City; 
import net.tuandn.training.model.GenericResult; 

final class GenericDeserializer$1 extends TypeToken<GenericResult<City>> 
{ 
} 

有沒有人請解釋爲什麼創建這個類?
什麼時候在編譯時創建多個類文件?

非常感謝!

+0

謝謝你的答案!第二個問題呢?請讓我知道所有情況! –

+0

在我的回答中更新。 –

+0

@RohitJain對不起,我還想知道,如果類沒有內部類,包括內部匿名類,有可能在編譯時生成多個類文件嗎?你明白我說的嗎?對不起我的英語不好!!! –

回答

4
new TypeToken<GenericResult<City>>() { 
} 

創建一個匿名內部類。匿名內部類,就像內部類一樣被編譯來分離類文件。由於匿名類沒有名稱,這就是爲什麼使用號碼來爲每個這樣的類生成唯一名稱的原因。在$之後你看到的號碼就是這個匿名類的編號,因爲它們在你的封閉類中是按順序排列的。

如果您使用更多的匿名類,該數字將增加1。所以,更多的匿名類,生成的類文件看起來像:

GenericDeserializer$1.class 
GenericDeserializer$2.class 
GenericDeserializer$3.class 
GenericDeserializer$4.class 
.... 

對於內部類然而,$後的值是內部類的名稱,因爲你已經會注意到。

什麼時候在編譯時創建了多個類文件?

是的,這些類是在編譯頂級類時生成的。

5

兩個類文件生成,因爲你是在下面的語句使用anonymous類:

TypeToken<GenericResult<City>>() { 
    ..... 
    } 

每個匿名類文件使用相同的名稱,容器類,並附加一個$ 1/$ 2等。

2

夠簡單,你的反編譯類顯示

final class GenericDeserializer$1 extends TypeToken<GenericResult<City>> 

所以,你有一個TypeToken<GenericResult<City>>地方。

翻翻你的代碼中,我們看到

Type type = new TypeToken<GenericResult<City>>() { /* anonymous inner class */ }.getType(); 

有一個匿名內部類的聲明,因此存在將與$X後綴獲得自己的類文件。

相關問題