2010-07-21 54 views
7
  1. 如何在Java中創建合成字段?如何在java中創建合成字段?

  2. java中的合成域只能在運行時創建嗎? 如果不是:是否有符合標準的方式來這在編譯時(沒有在類文件改變某些字節)

+2

爲什麼要手動創建合成字段?這有點違背它的規範,因爲它說「這是編譯器爲了啓用某些特定行爲而做的事情」。任何你想手動做的事都應該在外面看到。 – perdian 2010-07-21 10:41:29

回答

14

他們由編譯器生成時,語言的「怪事」要求他們。的一個簡單的例子是使用一個內部類:

public class Test 
{ 
    class Inner 
    { 
    } 
} 

Test.Inner類將有一個合成的字段來表示Test類的相應實例。

我們可以稍微延長該代碼表明場:

import java.lang.reflect.*; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     for (Field field : Inner.class.getDeclaredFields()) 
     { 
      System.out.println(field.getName() + ": " + field.isSynthetic()); 
     } 
    } 

    class Inner 
    { 
    } 
} 

隨着我的編譯器,是打印:

this$0: true 
3

是的,這是可行的,它被稱爲加載時編織。從本質上講,你將需要定義你自己的ClassLoader,它將決定一個類的情況是否修改一個正在加載的類文件;這意味着您將需要檢查正在加載的二進制類,可能會對其進行修改,然後將其傳遞給JVM以進行定義/解析。這有點麻煩,複雜,並且容易出現ClassCastExceptions(在兩個不同的類加載器中定義的同一個類將給出兩個不同於分配兼容的類)。

請注意,編織允許您做更多的事情:您可以添加新的方法,接口,字段,修改現有類的代碼等等。

已經有工具可以幫助你 - 例如AspectJ是一個全功能的語言修改,或者是像BCEL或javassist這樣的可以讓你編寫這種編織工具的工具。

相關問題