2015-09-04 41 views
1

我想使用僅在運行時環境中可用的類,並且我沒有任何.java或.class文件。使用它的唯一方法AFAIK是通過反思。我已經做了什麼,是寫一個小程序來獲得我的目標類的Class實例,迭代其公共方法/字段並獲得他們的簽名(類似於this program)。這會給我一個.java源文件的骨架。然後我手動填充這些方法的主體,以便他們使用反射調用真正的方法。所製作的Java文件由我的用戶代碼和javac編譯。這樣我就可以使用目標類而不用我的代碼填充Method/Field getters。Java反射包裝器代碼生成器?

這裏是我的問題:

  • 是否有什麼,我試圖做一個特定術語? (「Java反射包裝代碼生成器」也許?)
  • 有沒有一種工具可以自動執行我在上面手動執行的任務?
  • 如果不是,那麼在構建這樣的工具時面臨的挑戰是什麼?
+2

「我沒有任何.class文件」。聽起來不太可能。你在記憶中建立這個班級,還是你沒有班級檔案? – Kayaman

+0

我會說你正在嘗試編寫一個使用反射來構建它的橋接對象。 –

+0

聽起來像你正在buiilding一個[代理](http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Proxy.html) – OldCurmudgeon

回答

1

你試圖做的是代理類。很多框架使用它來注入一些自動化,事務等...... Java EE,例如Spring。

有兩種方法: 簡單的一個使用java.lang.reflect.Proxy,但它有一個約束:您的類必須實現一個接口,並且只能調用Interface中的方法。

更復雜的依賴於字節碼生成,你可以使用Mockito框架生成所有你需要的東西:它用於測試,但也可以用來生成任何類型的覆蓋現有類型的類。

我可以用例子來填寫我的答案,如果你需要的話。