2014-01-28 80 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类等。 –

相关问题