2010-11-16 54 views
4

使用類似ASMcglib的庫,有沒有辦法將字節碼指令添加到類中以便在類字段的值設置時執行代碼?字節碼操作攔截設置字段的值

例如,假設我有這個類:


    public class Person 
    { 
     bool dirty; 
     public String name; 
     public Date birthDate; 
     public double salary; 
    } 

假設一段代碼包含此行:

person.name = "Joe";

我想這個指令被截獲,因此dirty標誌設置爲true。我知道這是可能的設置方法 - person.setName (「Joe」) - 類方法可以通過字節碼操作進行修改,但我想對字段做同樣的事情。

這是可能的,如果是這樣,如何

編輯

我想避免修改代碼段訪問類的,我正在尋找一種方式,讓攔截代碼爲Person類的一部分。是否存在用於字段訪問的僞方法,類似於Python類中的屬性?

+0

後編輯。您可以專門檢查正在加載的類是否爲Person,如果是,則選擇將此特定的檢測應用於其中。這不符合您的要求嗎? – 2010-11-16 20:00:02

+0

謝謝,我想知道的是:我在哪裏放字節碼?是否有一個方法,只要其中一個字段被訪問,就在該類上調用?或者我將不得不尋找所有其他類,尋找字段訪問的實例並用方法調用替換它們? – 2010-11-17 06:55:00

+1

認爲我會提到它,但是當一個字段是私人的,但該類是另一個類的內部類時,即使是私人的,該外部類也可以直接訪問該字段。它通過生成訪問該字段的綜合方法來實現此目的。如果你僅限於這種情況,那麼你可以修改合成方法,然後像python一樣工作。 (但通常答案是否定的,您必須修改常規方法。) – MeBigFatGuy 2011-06-10 03:40:04

回答

0

總之,你需要注入字節碼,做感興趣的方法如下:

if (person.name.equals("Joe") { 
    dirty = true; 
} 

無法評估在儀表時間現場 - 它當方法執行是在運行時。

關於你如何,請嘗試以下問題:

  • 寫一個測試類的代碼和生成字節碼的ASCII版本里可以看到生成的內容。您可以使用javap輕鬆完成此操作。
+0

您可以將源類修改爲您想要的,然後使用asmify生成asm代碼以生成該轉換。 – MeBigFatGuy 2011-06-10 03:42:17