2011-02-27 19 views
7

我想用scalac創建的類來測試新的類型檢查字節碼驗證程序。如何使用Scala(50.0/51.0)發佈較新的類文件版本?

scalac當前輸出版本49.0的類文件,但是新的類型檢查驗證器僅在版本51.0以後纔是必需的。

我試圖用ProGuard(實際上已將它們轉換爲版本50.0)對類進行「預驗證」,但是我不確定新的驗證器是否會自動回退到舊的類型 - 推理驗證器。

如何將類文件轉換爲版本51.0(或者如何查找加載版本50.0的類文件時使用哪個驗證器)?

回答

2

看起來像FJBG(庫NSC用來生成字節碼)已經看到一些努力支持StackMap,但我不知道它有多遠。

如果你問斯卡拉內部,Stephane Michelou可能會彈出。他是working on it的球員。

+0

謝謝!你的回答非常有趣和有幫助。 – soc 2011-03-15 10:51:09

1

我不確定,但我認爲字節碼格式沒有經過深刻的改變,它可能總是向後兼容。 (如果你知道關於字節碼的一些東西,請記住long和double在常量池和操作數堆棧中的雙打,這些設計有點瘋狂。它沒有被修改,是嗎?)因此,更改主要/次要編號可能會起作用。

怎麼辦?有兩種方法:

  • 使用hexa編輯器並手動修改它。如果知道字節的位置,它應該非常簡單。它有[字節碼規範] [1],它說,你應該跳過前四個字節,你會看到兩個字節的小版本和兩個字節的主版本(按此順序)。
  • 使用庫。我有一些BCEL的經驗。它似乎不是我見過的最好設計的圖書館,但它應該足夠適合你的情況。我在類中看到了setMinor和setMajor方法(請看ClassGen和「幾乎不可變的」JavaClass)。

[1] http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

+3

不,這不行。 51.0引入了一個強制的StackMap屬性,它與類型檢查驗證器一起使用。更改版本不會添加它。 – soc 2011-03-01 09:20:03

+0

嗯,這是interresting。我認爲這不是強制性的。 (我不是在談論J2ME中的類似概念。)但是,我不明白你所做的「預驗證」操作。如果是J2ME預校驗,則不會將該類文件轉換爲新版本。如果它是更新的概念,它將不得不將其轉換爲51.0而不是50.0。順便說一句,您還可以檢查ASM庫/工具。我在調試時使用它進行了一些字節碼驗證,並且能夠推斷操作數堆棧類型,因此可以簡單地在此恕我直言上構建生成StackMap。 – v6ak 2011-03-02 20:42:09

1

我會使用ASM解析字節碼。我知道scala(和clojure)在內部使用ASM,所以花在學習上的努力不會被浪費。您可能會拼湊一個ClassReaderEmptyVisitor,它會覆蓋提供相應快速頭信息的訪問方法。

+0

scala不在內部使用ASM。 – extempore 2011-03-10 07:29:34

+0

我甚至在我說過之前就想過在網上查一下。顯然只有scala [eclipse插件](https://codereview.scala-lang.org/fisheye/qsearch?q=org.objectweb.asm)。我的錯誤的appologies。 – Matt 2011-03-10 18:51:38

0

我知道這可能是顯而易見的,但我讀了你的問題後,我不知道,所以我會問:

您使用的是測試版打造?就像在每晚的建築中一樣?或者你想修改當前版本?

編輯:好的,有些東西我不明白。我剛剛嘗試過夜間版本,是的,它們是49.0版本。但據我所知,這是由編譯器設置的。

您正試圖更改版本以獲得一些新的奇特功能。但是這對我沒有意義。如果編譯器發佈版本49.0,則將其更改爲任何較新的版本(重要時爲50.0,51.0或70.0)不應該有任何影響。據我所知,該版本是爲了確保兼容性,這意味着您將不會使用不支持您的語言的較舊虛擬機運行較新的類。

因此,在您的情況下,添加新版本意味着可能當前的虛擬機不會運行您的代碼。即使這樣做,它可能不包含您提到的功能,如果該功能僅在您當前的編譯器/虛擬機不支持的版本51.0中。

我的意思是,也許你正在嘗試做的事情是完全正常的,只是我不知道這件事,而且我在這方面表現出我的無知:),但我認爲那裏缺少一些東西。

+0

我正在使用當前的2.9中繼。 – soc 2011-03-11 13:06:34

0

我想最容易做的事情之一是使用java反編譯器(請參閱JADClipse針對Eclipse插件),然後將源代碼重新編譯爲您需要的任何版本。

+1

我不認爲它會在Scala源代碼 - >字節碼 - > Java源代碼 - >字節碼之間往返。並非所有Scala都可以轉換爲Java。 – soc 2011-03-11 16:48:26

相關問題