2014-01-28 132 views
1

有沒有一種使用反射來編程創建類的方法?例如。是否有一個私有構造函數,我們可以使用它來創建一個類類型,然後可以用它來創建該類的實例?有沒有辦法通過編程創建java類類型?

我知道還有其他的技巧,例如生成源代碼並編譯它,或者生成字節碼並使用類加載器加載它......但是我想看看是否有可能以某種方式創建一個java.lang的實例.Class直接。

我想寫Clojure中下面的代碼:

(def c (create-class "com.example.Dog" {:fields {"legs" 4} 
             :methods {"bark" (... do something ...)} 
             :constructors {.....}})) 

(def d1 (.newInstance c)) 
(def d2 (.newInstance c)) 
+2

這真的不清楚你在這裏問什麼。你能提供更多細節嗎? –

+1

你問題中的Clojure部分在哪裏? – Chiron

+0

爲了澄清,你需要一種方法來定義一個新的'類'(不是創建一個現有類的新對象)使用反射? – Gus

回答

4

Clojure中有幾種方法來生成類根據自己的需要:他們在Clojure types page描述雖然我發現類型的章節中Clojure Programming最有幫助作爲動態生成類的各種方式的比較。

  • defrecord
  • DEFTYPE
  • 代理
  • 根級
  • 協議
  • 具體化

在這些生成的字節碼,並使用類加載器(加載它除了發動機罩gen-class)寫入類文件。這個主題還有很多,比我在這裏可以提供的內容還要詳盡,請查閱Clojure編程(或者您最喜歡的Clojure書籍)一章。

+0

有沒有辦法做到這一點,而不經過類加載器? IE瀏覽器。黑客? – zcaudate

+0

將類加入jvm的唯一方法是通過類加載器。 – sw1nn

+0

每次創建函數時都會使用Classloader,這裏的混淆可能與clojure運行時在內部使用類加載器有關。你不需要知道任何關於他們使用clojure來生成命名的java類等。 –

相關問題