如何在Java中創建合成字段?如何在java中創建合成字段?
java中的合成域只能在運行時創建嗎? 如果不是:是否有符合標準的方式來這在編譯時(沒有在類文件改變某些字節)
7
A
回答
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這樣的可以讓你編寫這種編織工具的工具。
相關問題
- 1. 創建集合字段JSP Java
- 2. AEM Java - 創建集合 - 如何創建吊索:成員?
- 3. 如何在infusionsoft中創建合併字段
- 4. 如何在Apache Solr中創建複合鍵字段?
- 5. Java中的合成字段是什麼?
- 6. 如何在JPA2中創建@ManyToOne字段?
- 7. 如何在DataGridView中創建LookUp字段?
- 8. 如何在java中創建實時跟蹤搜索字段
- 9. 如何在java中設置創建對象的字段
- 10. 如何在Java中使用map作爲字段創建枚舉?
- 11. Android:如何在java類中創建EditText字段
- 12. 如何在Git中成功創建十字交叉合併?
- 13. 如何在Java中創建一個創建文本字段的GUI按鈕?
- 14. 如何在Java中創建字典?
- 15. 如何在Java中創建字典?
- 16. 如何在Java中創建隨機生成的字母表
- 17. 如何結合2列中的字段來創建「矩陣」?
- 18. 如何在@ManyToOne字段上創建@Index?
- 19. 如何在java中創建的Layout中創建地圖片段(GoogleMap)?
- 20. 如何完成javafx階段創建
- 21. 如何在Java中使用共振峯合成從頭開始創建聲音?
- 22. 如何在「創建」中在sails.js/waterline中添加新字段?
- 23. 如何從兩個Django表單創建一個字段集合?
- 24. 創建自定義字段:如何混合ImageField和ColorField?
- 25. 如何僅在Django中創建表單字段數字
- 26. 如何在MS CRM 2011中爲實體創建數字字段
- 27. 如何在editionView()和creationView()中創建多個字符串字段?
- 28. 如何在doctrine 2中創建UniqueIndex和空字符串字段?
- 29. 如何在mongodb中創建集合並指定字段的數據類型
- 30. 如何在使用聚合的kibana 4中創建腳本字段?
爲什麼要手動創建合成字段?這有點違背它的規範,因爲它說「這是編譯器爲了啓用某些特定行爲而做的事情」。任何你想手動做的事都應該在外面看到。 – perdian 2010-07-21 10:41:29