2011-11-05 69 views
4

是否有可能在運行時用反射來改變類對象的繼承層次?用反射改變java類超類

我的情況是我有:

父類

中產階級擴展父類

BottomClass擴展父類

我想使用反射在運行時改變BottomClass延長中產階級。這可能嗎?監守反射來分析現有的代碼,而不是改變它

感謝

+7

有沒有你想要這樣做的原因? –

+0

我正在修改一個現有的軟件包,併爲其提供的對象進行自定義擴展。我希望這些自定義功能可以滴流到我自定義的父級的子類。 – ndm13

回答

4

不,這是不可能通過反射。

+1

然而,你可以改變常量('static final'字段)。 – BalusC

+0

是的,可以通過反射進行小的修改。但我會說這不會改變代碼本身,這只是對它的訪問方式的修改。 – Malcolm

0

繼承是靜態的,所以它不能在運行時更改。

但是,您可以使SuperClass爲接口或使用委託而不是繼承。

-1

這是不可能的。例如,如果你已經有一個BottomClass的對象,並且你正試圖改變超類,那個對象會發生什麼?這是不可能的...

5

與Java最接近的是instrumentation。基本上你可以編寫一些Java類,它們被賦予定義一個類的一系列字節,並與字節碼混合在一起,然後返回修改後的類文件字節數組。然後將這些類打包到一個JAR文件中,並通知JVM使用它們,可以在命令行上或通過將特性放入檢測JAR文件的清單文件中。

當然,如果你這樣做,你會想使用一些字節碼操作庫,如ASM

編輯:如果你感興趣的類實現了接口,你可能想通過java.lang.reflect.Proxy看看dynamic proxy classes。這樣做的缺點是代碼片段,你沒寫裏面做new ClassOfInterest()不受影響,但具有的優點是:

  1. 作爲不是修改類的字節碼容易得多。
  2. 您可以動態選擇讓代理的不同實例行爲,就像它們具有不同的超類型一樣。
  3. 您不必擔心任何SecurityManager問題。