[英]Accessing class bytes?
我的目標是訪問表示類的字節碼的byte [],而無需在運行時專門知道類文件的位置。
我已經研究了兩種解決方案,並且能夠從其中一種解決方案取得輕微的成功,但我想知道是否有其他方法可以實現它(或者我在第二種解決方案中出錯了我無法工作)。
我的第一個(溫和)成功的解決方案是使用java.lang.instrumentation ClassFileTransformer類來訪問類的byte []。 雖然這個問題,我認為必須有一個更清潔的方法來實現這一目標。
我的第二個解決方案是使用-Xbootclasspath JVM參數將java.lang.ClassLoader替換為我自己的允許它訪問加載的類的byte []。 我添加了一個簡單的System.out.println調試消息,以確認ClassLoader的覆蓋是否正常,但事實並非如此。 我從這篇論文中得到了關於同一主題的這個想法。 我的課程類似於在鏈接的論文中重新編寫Integer類的方法。 我還使用了類似的JVM參數目錄設置,如下所示:
java -Xbootclasspath/p:.\out\production\boot\java\lang TestLoader
我的想法是使用我鏈接的論文中的方法不能覆蓋ClassLoader類。
我很想知道為什么我重寫ClassLoader的嘗試不起作用,並且還聽到我還能做什么來訪問類的byte []。
你能用getResourceAsStream()讀取類字節嗎?
InputStream is = String.class.getResourceAsStream("String.class");
編輯添加備選:
(從評論中復制)
鑒於需要涵蓋的所有可能性, ClassFileTransformer和instrumentation API可能是最佳選擇。 我不知道'clean'的要求是什么,但是如果問題是必須為JVM指定命令行參數,你可以嘗試使用Attach API - 你可以附加到已經運行的Java進程,推入你的ClassFileTransformer ,查看已加載到JVM中的所有類以及之后加載的所有類。
我能找到的唯一解釋是法語,但代碼仍在java中。 :)
第1-8頁解釋了如何構建類加載器並提供從類文件中獲取字節的好主意。
此致,stéphane
我認為你剛剛啟動了類路徑錯誤。 假設類加載器類文件是:
.\out\production\boot\java\lang\ClassLoader.class
你應該使用:
java -Xbootclasspath/p:.\out\production\boot TestLoader
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.