2010-11-28 86 views
0

我已經定義了我自己的類加載器,它需要從類路徑中讀取字節碼,對其進行增強並定義類。我最初的實現有一條看起來像這樣的線:從類路徑讀取字節碼

getResourceAsStream(name.replaceAll("\\.", File.separator)+".class"); 

但我似乎已經超出了這種破解。我遇到了像嵌套子類一樣的邊界條件,這條線不能正確處理。

什麼是正確/被接受的解決方案?

謝謝!

+0

資源總是有一個`/`分隔的路徑名。 (請參閱http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html) – dacwe 2010-11-28 10:30:42

回答

0

如果name是類的二進制名稱,那麼資源文件名通常會是:

separator + name.replaceAll("\\.", separator) + ".class" 

一類的binary name是在字節碼文件中使用的值,並通過Class.getName()返回。

注意,資源名稱分隔符是不一定相同的File.separator。例如,如果類加載器是從JAR文件加載的,則分隔符由JAR文件API定義,而不是由文件系統約定定義。

您使用二進制名稱嵌套/匿名類提供,這應該所有的工作。但是,完全合格的類名到二進制類名的映射是編譯器特有的,並且不容易自動重現。 (您需要重現編譯器用於分配名稱組件的方案,這將需要訪問源代碼。)因此,讓您的類加載器瞭解完全限定的名稱將很困難。不過沒關係,因爲正常的類加載器不...

最後,請注意,我說的「傳統」。從理論上講,只要你能弄清楚如何一致地進行映射,你就可以實現你想要的任何類文件命名方案。

+0

似乎默認類加載器需要一種方法來識別類。可能有辦法利用已有的查找機制? – Jim 2010-11-28 09:21:16