我已經定義了我自己的類加載器,它需要從類路徑中讀取字節碼,對其進行增強並定義類。我最初的實現有一條看起來像這樣的線:從類路徑讀取字節碼
getResourceAsStream(name.replaceAll("\\.", File.separator)+".class");
但我似乎已經超出了這種破解。我遇到了像嵌套子類一樣的邊界條件,這條線不能正確處理。
什麼是正確/被接受的解決方案?
謝謝!
我已經定義了我自己的類加載器,它需要從類路徑中讀取字節碼,對其進行增強並定義類。我最初的實現有一條看起來像這樣的線:從類路徑讀取字節碼
getResourceAsStream(name.replaceAll("\\.", File.separator)+".class");
但我似乎已經超出了這種破解。我遇到了像嵌套子類一樣的邊界條件,這條線不能正確處理。
什麼是正確/被接受的解決方案?
謝謝!
如果name
是類的二進制名稱,那麼資源文件名通常會是:
separator + name.replaceAll("\\.", separator) + ".class"
一類的binary name是在字節碼文件中使用的值,並通過Class.getName()
返回。
注意,資源名稱分隔符是不一定相同的File.separator
。例如,如果類加載器是從JAR文件加載的,則分隔符由JAR文件API定義,而不是由文件系統約定定義。
您使用二進制名稱嵌套/匿名類提供,這應該所有的工作。但是,完全合格的類名到二進制類名的映射是編譯器特有的,並且不容易自動重現。 (您需要重現編譯器用於分配名稱組件的方案,這將需要訪問源代碼。)因此,讓您的類加載器瞭解完全限定的名稱將很困難。不過沒關係,因爲正常的類加載器不...
最後,請注意,我說的「傳統」。從理論上講,只要你能弄清楚如何一致地進行映射,你就可以實現你想要的任何類文件命名方案。
似乎默認類加載器需要一種方法來識別類。可能有辦法利用已有的查找機制? – Jim 2010-11-28 09:21:16
資源總是有一個`/`分隔的路徑名。 (請參閱http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html) – dacwe 2010-11-28 10:30:42