一個類是否可以在運行時向其自身添加一個方法(例如從一個static塊中),以便某人在該類上執行反射時,即使未在編譯時定義該方法,他們也會看到該新方法?背景:我使用的框架期望Action按照doAction(...)慣例定義具有方法的類??蚣茉谶\行時檢查這些類,以查看其doAction()方法中可用的參數類型。例如:doAction(String a,Integer b)我希望每個類都能在檢查時及時以編程方式生成doAction()帶有各種參數的方法。方法的主體可以為空。
3 回答

慕尼黑8549860
TA貢獻1818條經驗 獲得超11個贊
這并不簡單。一旦由類加載器加載了一個類,就無法更改已加載類的方法。當請求一個類時,一個類加載器將加載它并鏈接它。而且(使用Java)無法更改鏈接的代碼或添加/刪除方法。
我想到的唯一技巧是使用類加載器。如果我們刪除一個自定義的類加載器,則該類加載器加載的類也應刪除或不可訪問。我想到的是
實現一個自定義類加載器
加載動態類與定制ClassLoader
如果我們有此類的更新版本,
刪除自定義類加載器并
使用自定義類加載器的新實例加載此類的新版本
我將其留為思考的食物,無法證明,如果這導致解決方案或我們有陷阱。
作為對問題的簡單回答:不,我們不能像在反射中更改字段內容那樣更改已加載的類。(我們也無法添加或刪除字段)。

冉冉說
TA貢獻1877條經驗 獲得超1個贊
不,在Java中不可能(輕松)實現。
聽起來好像您在嘗試使用Java,就像它是一種動態編程語言一樣。例如,Ruby具有開放類:您可以在運行時從Ruby類中添加和刪除方法。在Ruby中,您的類中也可以有一個“缺少方法”的方法,當您嘗試調用該類中不存在的方法時,該方法將被調用。Java中也不存在這樣的東西。
有一個在JVM上運行的Ruby版本,即JRuby,它必須執行非常困難的技巧才能使開放類在JVM上工作。
添加回答
舉報
0/150
提交
取消