2009-06-26 46 views

回答

9

忽略悲傷的世界,你可能會通過自我修改的代碼(!),在我看來,有3個選項:

  1. 使用內置的編譯器支持Java 6和寫入/重新編譯/重裝類
  2. 使用Apache BCEL字節碼操作庫來編寫你的類直接
  3. 利用Java 6中的內置腳本支持(或使用Apache BSF)寫在你選擇的JVM的腳本語言的方法,並執行這些

上述三者中,我最初的選擇(沒有需求)會是ta看看選項3.我懷疑這是最痛苦的開始。我已經使用了以上所有內容 - 很遺憾,我無法發佈鏈接到客戶端代碼。

1

這應該很難實現。但是您可以在運行時創建新類並使用自定義類加載器加載它們。如果你想再次修改代碼,你必須重新加載類。

+0

這將是一個相當工廠的方法! – akf 2009-06-26 11:03:12

-2

你總是可以只使用一個動態語言...

+0

我覺得這個問題是無聊的,所以你回答可能是不對的。 – IAdapter 2009-06-26 11:49:29

+2

-1因爲問題是關於Java的明確說明 – 2009-06-26 12:12:25

+0

Java語言或Java虛擬機?這兩者之間存在巨大差異。 – OOPMan 2009-07-06 10:10:02

1

BCEL

字節碼工程庫的目的是給用戶 方便的可能性來分析,創建和操縱 (二進制)Java類文件(以.class結尾的文件)。 類由包含給定類的所有 符號信息的對象表示:特別是字節代碼指令的方法,字段和 。

1

我看到這些選項用於此目的:

  • 生成Java源代碼,並與外部的javac或內部編譯工具(不記得名字)編譯。由於您負責命名,只需在類名中包含版本計數以避免類加載異常。
  • 使用內置的JavaScript引擎支持
  • 有些場景可以使用Java Proxys

編輯解決:我曾經創造了一個Java 1.4的程序,它把業務規則從現有的傳統數據庫,生成的java文件(基本上是一個Predicate接口的實現)和一堆println(),並使用命令行javac編譯它們。

1

您可以在運行時使用庫如bcel編寫生成新類(字節碼)的代碼(Java)。這與自修改代碼不完全相同。我懷疑自修改代碼不是JVM支持的。

有關在運行時生成新代碼的示例,請查看clojure的源代碼。

0

作爲一名本科生,我在JikesRVM上工作。它是一個用Java實現的(大部分)JVM。在運行時它會自動編譯!這是一項非常酷的技術。