亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java類可以在運行時為其自身添加方法嗎?

Java類可以在運行時為其自身添加方法嗎?

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

3 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

這并不簡單。一旦由類加載器加載了一個類,就無法更改已加載類的方法。當請求一個類時,一個類加載器將加載它并鏈接它。而且(使用Java)無法更改鏈接的代碼或添加/刪除方法。

我想到的唯一技巧是使用類加載器。如果我們刪除一個自定義的類加載器,則該類加載器加載的類也應刪除或不可訪問。我想到的是

  1. 實現一個自定義類加載器

  2. 加載動態類與定制ClassLoader

  3. 如果我們有此類的更新版本,

  4. 刪除自定義類加載器并

  5. 使用自定義類加載器的新實例加載此類的新版本

我將其留為思考的食物,無法證明,如果這導致解決方案或我們有陷阱。

作為對問題的簡單回答:不,我們不能像在反射中更改字段內容那樣更改已加載的類。(我們也無法添加或刪除字段)。


查看完整回答
反對 回復 2019-09-24
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

不,在Java中不可能(輕松)實現。

聽起來好像您在嘗試使用Java,就像它是一種動態編程語言一樣。例如,Ruby具有開放類:您可以在運行時從Ruby類中添加和刪除方法。在Ruby中,您的類中也可以有一個“缺少方法”的方法,當您嘗試調用該類中不存在的方法時,該方法將被調用。Java中也不存在這樣的東西。

有一個在JVM上運行的Ruby版本,即JRuby,它必須執行非常困難的技巧才能使開放類在JVM上工作。


查看完整回答
反對 回復 2019-09-24
  • 3 回答
  • 0 關注
  • 1164 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號