是否有可能在運行時用反射來改變類對象的繼承層次?用反射改變java類超類
我的情況是我有:
父類
中產階級擴展父類
BottomClass擴展父類
我想使用反射在運行時改變BottomClass延長中產階級。這可能嗎?監守反射來分析現有的代碼,而不是改變它
感謝
是否有可能在運行時用反射來改變類對象的繼承層次?用反射改變java類超類
我的情況是我有:
父類
中產階級擴展父類
BottomClass擴展父類
我想使用反射在運行時改變BottomClass延長中產階級。這可能嗎?監守反射來分析現有的代碼,而不是改變它
感謝
繼承是靜態的,所以它不能在運行時更改。
但是,您可以使SuperClass
爲接口或使用委託而不是繼承。
這是不可能的。例如,如果你已經有一個BottomClass的對象,並且你正試圖改變超類,那個對象會發生什麼?這是不可能的...
與Java最接近的是instrumentation。基本上你可以編寫一些Java類,它們被賦予定義一個類的一系列字節,並與字節碼混合在一起,然後返回修改後的類文件字節數組。然後將這些類打包到一個JAR文件中,並通知JVM使用它們,可以在命令行上或通過將特性放入檢測JAR文件的清單文件中。
當然,如果你這樣做,你會想使用一些字節碼操作庫,如ASM。
編輯:如果你感興趣的類實現了接口,你可能想通過java.lang.reflect.Proxy看看dynamic proxy classes。這樣做的缺點是代碼片段,你沒寫裏面做new ClassOfInterest()
不受影響,但具有的優點是:
SecurityManager
問題。
有沒有你想要這樣做的原因? –
我正在修改一個現有的軟件包,併爲其提供的對象進行自定義擴展。我希望這些自定義功能可以滴流到我自定義的父級的子類。 – ndm13