2011-07-14 29 views
0

我想用反射(我需要的是從傳入的jar文件中的方法簽名信息)編寫反編譯器。我正在使用URLClassLoader從jar文件中加載類,然後將該類傳遞給我的反編譯器。當它已經從java中的其他地方加載時加載一個反射類

但是,我遇到了一個問題。我試圖讀取的jar包含已經加載到我的環境中的不同版本的類。所以當我打電話時

ClassLoader myClassLoader = URLClassLoader.newInstance(jars, null); 
Class<?> classToDecompile = Class.forName(className, false, myClassLoader); 

它不是從我的jar文件中返回類,而是已經加載的類。有沒有辦法只加載反射的類信息,並從傳入的jar而不是從JRE中獲取?

編輯:

我試圖反編譯的jar包含在java.lang包,這會導致安全異常被拋出類:

java.lang.SecurityException異常:禁止的軟件包名稱:java.lang

+0

什麼是堆棧跟蹤? – Ladlestein

+0

那麼,事實證明,我並不在乎java的過多與現在的JRE不同,所以我可以過濾掉它。 –

回答

3

ClassLoader.loadClass(String,boolean) - 哪個URLClassLoader繼承 - 首先檢查以前加載的類,然後找不到任何,檢查父類加載器。您可以重寫該方法以繞過以前加載的類的檢查。不知道你是否必須繞過父母。

請注意,這將是一個邪惡的類加載器;你可能不應該用它來做其他事情。你也可以嘗試自己讀取jar文件,獲取類文件的內容(字節代碼),並自己調用ClassLoader.defineClass(name,byte [],int,int),爲其提供一個唯一的名稱類。實際上,我認爲這是一個更好的主意。

0

爲什麼浪費時間JAD?如果你仍然想達到這個目標,你必須用child-first策略編寫自己的類加載器。

相關問題